- python中class的继承
class Person(object):
number = 61
def __init__(self):
self.name = '小明'
self.age = 18
self.gender = '男'
def func(self):
pass
class Student(Person):
def eat(self):
print('chi')
stu1 = Student()
print(stu1.name, stu1.func(), stu1.age, stu1.eat(), stu1.gender, stu1.number)
如上所示,Student类继承了Person类,并获得了Person的所有字段,属性,及方法
对于定义的每一个类,Python会计算出解析顺序(mro)列表
class.mro可以查看
- 多继承
如果一个类继承多个父类的情况下,会合并所有父类的mro并遵从下列原则:
- 子类会先于父类被检查
- 多个父类会根据它们在列表中的顺序被检查
- 如果对下一个类存在两个合法的选择,选择第一个父类
- 子类属性,方法基于父类的重写及 super()的使用
如果子类某些在父类属性基础上扩充则需要重新定义init()
经典的菱形继承
20190115210205895.png
注意:
子类的对象属性不能超过其各个父类属性个数的最大值,如果不同父类有不同的属性定义, 子类需要全部继承时,需要使用*arges, **kwarges 不定长参数 使父类的属性个数不定长,此时子类继承时能获得所有的属性
class Father(object):
def __init__(self, name, *arges, **kwargs):
self.name = name
super().__init__(*arges, **kwargs)
class Motner(object):
def __init__(self, age, *arges, **kwargs):
self.age = age
super().__init__(*arges, **kwargs)
class Student(Father, Motner):
def __init__(self, name, age):
super().__init__(name, age)
print(Student.__mro__)
stu1 = Student('asd', 18)
print(stu1.age)
print(stu1.name)
#结果
(<class '__main__.Student'>, <class '__main__.Father'>, <class '__main__.Motner'>, <class 'object'>)
18
asd