python 入坑路--类的继承

一、概述

  之前我们说到了类的公有属性,和私有属性。其实就是类的封装,下面来说说类的继承,就是面向对象的第二大特性。

面向对象编程(OOP)语言的一个主要功能就是“继承”。

继承:它可以使用现有类的所有功能,并无需重新编写原来类的情况下,对这些功能进行扩展。

  通过继承创建的类称为:子类,或者派生类,被继承类称为 “父类”、“基类”、“超类”,继承是从一般到特殊的过程。

在某些OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能继承一个父类,要实现多种继承,可以通过多级继承来实现。

  继承类的概率实现方式主要有两类:实现继承,接口继承。

1.实现继承:使用基类的属性和方法而无需额外编码的能力。---拿来就用

2.接口继承:仅使用基类的属性和方法,但是子类必须提供实现的能力(子类重构 父类方法)---自己改装一下再用。

  在考虑使用继承时,有一点需要注意,那就是两个类的关系必须是“属于”关系。例如:Empolyee 是一个人,Manager 也是一个人,

因此这两个类都可以继承Person 类。但是 Leg 类却不能继承Person 类,因为腿并不是一个人。

  抽象类仅定义将由子类创建的一般属性和方法,OO 开发范式:划分对象-->抽象类-->将类组织成为层次结构(继承和合成)-->用类与实例进行设计和实现几个阶段。

二、类的继承

搞例子。。。

#很简单的例子
class person(object): ''' 描述人 ''' def talk(self): print("persion is talking" ) class blackperson(person): #在括号中,写上 父类的,就继承了 def walk(self): print("blackpersong is walking") b=blackperson() b.talk() #继承父类的方法 #输出 persion is talking

  构造方法的继承

说明:因为子类有自己的属性,但是又想继承父类的属性,所以需要先继承,再重构

继承类的构造方法两招写法:

  1.经典类写法:父类.__init__(self,name,age)

  2.新式类写法:super(子类,self)__init__(name,age,变量名。。。)

注:建议使用新式类的写法,因为经典类的写法,在多继承的情况下,会出现重负调用参数的可能。

  例子搞起来。。。

class person(object):
    '''
    描述人
    '''

    def __init__(self,name,age):
        self.name=name
        self.age=age

    def talk(self):
        print("persion is talking" )

class blackperson(person): #在括号中,写上 父类的,就继承了
    '''
    描述黑人
    '''

    def __init__(self,name,age,sex):  #name,age,也需要写上去,来自父类
        #person.__init__(self,name,age) #继承父类变量,这是经典类写法
        super(blackperson,self).__init__(name,age) #新式类写法
        self.sex=sex

    def walk(self):
        print("blackpersong is walking")

    def info(self):
        print("%s,%s,%s" %(self.name,self.age,self.sex))

b=blackperson("niubi",18,"M")
b.info()

#输出结果
niubi,18,M 

  子类对父类方法的重写

重要条件:

  a、重写方法的方法名,必须和父类中被重写的方法名一样

  b、重写方法的传入的参数名,和参数个数,必须和父类中被重写的方法一样。

class person(object):
    '''
    描述人
    '''

    def __init__(self,name,age):
        self.name=name
        self.age=age

    def talk(self,food):
        print("persion is talking about %s" %food )

class blackperson(person): #在括号中,写上 父类的,就继承了
    '''
    描述黑人
    '''

    def __init__(self,name,age,sex):  #name,age,也需要写上去,来自父类
        #person.__init__(self,name,age) #继承父类变量,这是经典类写法
        super(blackperson,self).__init__(name,age) #新式类写法
        self.sex=sex

    def walk(self):
        print("blackpersong is walking")

    def info(self):
        print("%s,%s,%s" %(self.name,self.age,self.sex))

    def talk(self,food):
        print("blackperson is talking %s" %food)

b=blackperson("niubi",18,"M")
b.talk("Chiness food")
#输出

blackperson is talking Chiness food

  玩个大栗子

class SchoolMember(object):
    '''
    学习基类
    '''
    member=0 #设置公有属性
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
        self.enroll() #每次生成一个对象注册一次

    def enroll(self):
        '注册'
        print("just enroll a new school member %s" %self.name)
        SchoolMember.member+=1

    def tell(self):
        print('---------info %s-------' %self.name)
        for k,v in self.__dict__.items(): # __dict__() 是获取对象属性,以字典的形式返回
            print("\t%s:%s"%(k,v))
        print("-----end-----")

    # def __del__(self):
    #     print("开除了 %s" %self.name )
    #     SchoolMember.member -= 1

class Teacher(SchoolMember):
    '''老师类'''

    def __init__(self,name,age,sex,salary,course):
        super(Teacher,self).__init__(name,age,sex)
        self.salary=salary
        self.course=course

    def teaching(self):
        print("Teacher %s is teaching %s" %(self.name,self.course))

    def __del__(self):
        print("开除了 %s" %self.name )
        SchoolMember.member -= 1

class Student(SchoolMember):
    '''学生类'''
    def __init__(self,name,age,sex,course,tuition):
        super(Student,self).__init__(name,age,sex)
        self.course=course
        self.tuition=tuition

    def pay_tuition(self,amount):
        print("Student %s has just paied %s " %(self.name,self.tuition))
        amount+=1

    def __del__(self):
        print("开除了 %s" %self.name )
        SchoolMember.member -= 1

t1=Teacher("牛逼",18,"M","30000","py15")
s1=Student("牛1",18,"M","py15",20000)
s2=Student("牛2",18,"M","PY15",11000)

print(SchoolMember.member)

t1.tell()
s1.tell()
s2.tell()

del t1
print(SchoolMember.member)

  

 

posted @ 2018-02-01 14:42  东郭仔  阅读(159)  评论(0)    收藏  举报