一、简介
1、继承是类下建新类的方式,父类可以称为基类或超类,新类可以称为子类或派生类,子类可以继承父类的属性。
2、父类可以被多个子类继承,子类亦可以继承多个父类。
3、在python3中,最高祖类默认继承了内置的object类。
4、在python2中,最高祖类没有默认继承,此时,该类及其子孙类都是经典类。除非明确最高祖类的父类为内置的object,那该类及其子孙类就都是新式类。
class GreatGrandfather: x = 111 class Grandfather(GreatGrandfather): pass class Father(Grandfather): pass class Son(Father): pass son_obj_1 = Son() print(GreatGrandfather.__bases__) # python3 结果为 (<class 'object'>,) python2 结果为 () print(son_obj_1.x) print(Son.x) print(Father.x) print(Grandfather.x) # 以上结果都为 111
二、多继承:某个子类继承了多个父类
1、优点:子类可以使用每个父类的属性,提高了代码的利用率。
2、缺点:
①从思维逻辑上讲,这种子类自身属于某个“大类”的界定变得模糊。
②代码的可读性和拓展性变差,有可能会引发“菱形问题”。
3、如果不可避免地需要使用多继承的方式,应该用mixins机制。
三、用继承解决代码冗余
class Employee: gender = 'male' # 子类共有数据属性 def __init__(self, name, age): # 子类实例化对象时共有属性 self.name = name self.age = age def show_name(self): # 子类共有功能 print('这是员工{}'.format(self.name)) class Worker(Employee): def work_time(self, time): # Worker子类特有功能 print('{}今日工时为:{}'.format(self.name, time)) class Manager(Employee): def __init__(self, name, age, skill): Employee.__init__(self, name, age) # Manager子类实例化对象时,若父类已有,可直接引用 self.skill = skill # 父类没有的,再自行定义 def work_target(self, target): # Manager子类特有功能 print('{}本月指标为:{}'.format(self.name, target)) worker_obj_1 = Worker('tom','18') worker_obj_1.show_name() worker_obj_1.work_time('8h') manager_obj_1 = Manager('jan','20','dance') manager_obj_1.show_name() manager_obj_1.work_target('10亿') # 结果为 ''' 这是员工tom tom今日工时为:8h 这是员工jan jan本月指标为:10亿 '''
四、属性查找顺序
1、单继承的情况:因为是直线关系,只需遵循辈分由小到大查找即可。
2、多继承的情况:
①非菱形结构,经典类和新式类的查找顺序是一致的,都是按照从左到右的顺序,一个分支寻完再寻下一个分支,最后寻object。
②菱形结构:
经典类:深度优先,查找第一个分支时就会先找到最顶头,再下个分支。
新式类:广度优先,查找第一个分支时会截止到最顶头之前,待所有分支寻完,再寻最顶头,最后寻object。
③总结:多继承有时必须要用,但是继承结构要避免过于复杂,而且最好使用mixins机制。