- 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的所有字段,屬性,及方法
對(duì)于定義的每一個(gè)類,Python會(huì)計(jì)算出解析順序(mro)列表
class.mro可以查看
- 多繼承
如果一個(gè)類繼承多個(gè)父類的情況下,會(huì)合并所有父類的mro并遵從下列原則:
- 子類會(huì)先于父類被檢查
- 多個(gè)父類會(huì)根據(jù)它們在列表中的順序被檢查
- 如果對(duì)下一個(gè)類存在兩個(gè)合法的選擇,選擇第一個(gè)父類
- 子類屬性,方法基于父類的重寫及 super()的使用
如果子類某些在父類屬性基礎(chǔ)上擴(kuò)充則需要重新定義init()
經(jīng)典的菱形繼承
20190115210205895.png
注意:
子類的對(duì)象屬性不能超過其各個(gè)父類屬性個(gè)數(shù)的最大值,如果不同父類有不同的屬性定義, 子類需要全部繼承時(shí),需要使用*arges, **kwarges 不定長參數(shù) 使父類的屬性個(gè)數(shù)不定長,此時(shí)子類繼承時(shí)能獲得所有的屬性
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)
#結(jié)果
(<class '__main__.Student'>, <class '__main__.Father'>, <class '__main__.Motner'>, <class 'object'>)
18
asd
