Tout d'abord, mixin
La bonne façon d'ouvrir l'héritage multiple: le mécanisme des mixins
Le cœur du mécanisme des mixins: il s'agit d'améliorer autant que possible la lisibilité de l'héritage multiple dans le cadre de l'héritage multiple
ps: laissez l'héritage multiple satisfaire les habitudes de pensée des gens = "quoi" est "quoi"
class Vehicle:
pass
class FlyableMixin:
def fly(self):
pass
class CivilAircraft(FlyableMixin,Vehicle): # 民航飞机
pass
class Helicopter(FlyableMixin,Vehicle): # 直升飞机
pass
class Car(Vehicle): # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
pass
Soyez très prudent lorsque vous utilisez la classe Mixin pour implémenter l'héritage multiple
- Tout d'abord, il doit représenter une certaine fonction, pas un élément. Python nomme généralement la classe mixin avec le suffixe Mixin, able, ible
- Deuxièmement, elle doit avoir une seule responsabilité. S'il existe plusieurs fonctions, écrivez plusieurs classes Mixin. Une classe peut hériter de plusieurs Mixin. Afin de garantir le respect du principe d'héritage "is-a", un seul parent peut être hérité qui identifie la signification de son attribution. Classe
- Ensuite, cela ne dépend pas de l'implémentation de la sous-classe
- Enfin, même si la sous-classe n'hérite pas de la classe Mixin, elle fonctionne toujours, mais il lui manque une certaine fonction. (Par exemple, l'avion peut toujours transporter des passagers, mais il ne peut pas voler)
2. Dérivation
派生:子类中衍生出的新东西
1、子类独有,父类没有
2、子类有,父类也有,子类是完全覆盖父类的
3、子类有,父类也有,子类是在父类的基础上进行拓展
Comment réutiliser les fonctions de la classe parent dans la nouvelle méthode dérivée de la classe enfant
Méthode 1: le nom de famille nommé appelle une fonction dans une certaine catégorie = "ne dépend pas de l'héritage
class OldboyPeople:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def f1(self):
print('%s say hello' %self.name)
class Teacher(OldboyPeople):
def __init__(self,name,age,sex,level,salary):
OldboyPeople.__init__(self,name,age,sex)
self.level = level
self.salary=salary
tea_obj=Teacher('egon',18,'male',10,3000)
print(tea_obj.__dict__)
{'name': 'egon', 'age': 18, 'sex': 'male', 'level': 10, 'salary': 3000}
Méthode 2: super () appelle la méthode fournie par la classe parente à elle-même = "dépend strictement de la relation d'héritage
L'appel super () obtiendra un objet spécial, l'objet se référera au mro de la classe qui a lancé la recherche d'attribut, va à la classe parent de la classe courante
class OldboyPeople:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def f1(self):
print('%s say hello' %self.name)
class Teacher(OldboyPeople):
def __init__(self,name,age,sex,level,salary):
# super(Teacher,self).__init__(name,age,sex)
super().__init__(name,age,sex) # 调用的是方法,自动传入对象
self.level = level
self.salary=salary
# print(Teacher.mro())
tea_obj=Teacher('egon',18,'male',10,3000)
print(tea_obj.__dict__)
{'name': 'egon', 'age': 18, 'sex': 'male', 'level': 10, 'salary': 3000}
# super()案例
class A:
def test(self):
print('from A')
super().test()
class B:
def test(self):
print('from B')
class C(A,B):
pass
obj=C()
obj.test()
print(C.mro())
from A
from B
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]