Python-类继承
当在Python中出现继承的情况时,初始化函数_init_的行为如下:
子类没有定义初始化函数,父类的初始化函数会被默认调用;但要实例化子类的对象,则只能传入父类的初始化函数对应的参数,否则会出错。
子类定义了初始化函数,而子类中没有显示调用父类的初始化函数,则父类的属性不会被初始化
子类定义了初始化函数,而且在子类中显示调用父类的初始化函数,则子类和父类的属性都会被初始化
super主要来调用父类方法来显示调用父类,在子类中,子类会继承父类的所有的属性和方法,子类也可以覆盖父类同名的属性和方法。
class Person(): def __init__(self): print('Hi Person') def sy(self): print('Hi sy') class Student(Person): def sk(self): super().sy() def sd(self): super(Student,self).sy() def sh(self): Person.sy(self) s=Student() s.sy() s.sk() s.sd() s.sh()
结果显示如下:
Hi Person
Hi sy
Hi sy
Hi sy
Hi sy
多重继承:
Python3以后均为新式类,可使用实例的属性__mro__来查看类的继承查找顺序
>>> class Per():
pass
>>> class Stu(Per):
pass
>>> class Gla(Per):
pass
>>> class Fin(Stu,Gla):
pass
>>> print(Fin.__mro__)
(<class '__main__.Fin'>, <class '__main__.Stu'>, <class '__main__.Gla'>, <class '__main__.Per'>, <class 'object'>)
但是如果Gla不是继承Per,则继承查找顺序会改变
>>> class Msg():
pass
>>> class Inf(Msg):
pass
>>> class Fid(Stu,Inf):
pass
>>> print(Fid.__mro__)
(<class '__main__.Fid'>, <class '__main__.Stu'>, <class '__main__.Per'>, <class '__main__.Inf'>, <class '__main__.Msg'>, <class 'object'>)
>>>