python 继承
一、简介
1、作用
简化代码
2、分类
一个父类可以被多个多个子类继承
一个子类可以继承多个父类---python独有
3、新式类和经典类
python3中,只含义新式类,新式类默认继承Object
python2.7中含义经典类和新式类,新式类需要继承Object
4、方法
类名.__base__查看该类的继承顺序
类.mro(),返回类的调用顺序
class A: print('A') class B(A): print('B') class C(A): print('C') class D(B, C): print('D') print(D.__bases__) # (<class '__main__.B'>, <class '__main__.C'>) print(D.mro()) # [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
二、单继承
1、派生
派生属性:在子类中,创建父类中没有的属性
派生方法:在子类中,创建父类中没有的方法
2、顺序
1)子类对象的调用顺序
子类属性、方法,若没有到父类的属性、方法,若没有到Object,若没有,则报错
2)调用父类
1)通过子类对象调用,若子类有同名方法,会调用子类的方法
2)通过父类名直接调用父类
3)使用super(类名, 已定义的对象名).类方法名
3、用父类的属性、方法
1)父类名.__init__(self, 父类的其它属性)
2)super().__init__(父类的其它属性)
4、super()
super()方法只在python3中存在
在类内部可以不写()内的类名和对象名
super()的本质:不是单纯找父类,而是根据调用者的节点位置的广度优先顺序来的
class Person: def __init__(self, name, sex, age): self.name = name self.sex = sex self.age = age def introduce(self): print('父类方法', self.name) class Student(Person): def __init__(self, name, sex, age, grade): Person.__init__(self, name, sex, age) # 通过父类直接调用__init__方法 self.grade = grade # 派生属性 def gr(self): # 派生方法 print(self.grade) class Worker(Person): def __init__(self, name, sex, age, money): super(Worker, self).__init__(name, sex, age) # Worker, self 可以不写 self.money = money # 派生属性 def make(self): # 派生方法 print(self.money) s1 = Student('tom', 'man', 24, 99) s1.gr() # 99 print(s1.name) # tom s1.introduce() # 父类方法 tom, 调用父类方法,若子类有同名方法,会调用子类的方法 Person.introduce(s1) # 调用父类方法 super(Student, s1).introduce() # 调用父类方法
三、多继承
1、一个子类继承多个父类
2、调用顺序
默认是就近原则
新式类:广度优先
经典类:深度优先
3、新式类
1)钻石继承
class D: print('D') class B(D): print('B') class C(D): print('D') class A(B, C): print('A')
2)
3)
4、经典类
深度优先,一条路走到黑
ps:组合和继承怎么抉择?
组合:什么有什么
继承:什么是什么