一、简介
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、多继承的情况: