まず、ミックスイン
多重継承を開く正しい方法:ミックスインメカニズム
ミックスインメカニズムのコア:多重継承のコンテキストで多重継承の可読性を可能な限り向上させることです
PS:多重継承が人々の思考習慣を満足させる=「何」は「何」
class Vehicle:
pass
class FlyableMixin:
def fly(self):
pass
class CivilAircraft(FlyableMixin,Vehicle): # 民航飞机
pass
class Helicopter(FlyableMixin,Vehicle): # 直升飞机
pass
class Car(Vehicle): # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
pass
Mixinクラスを使用して多重継承を実装する場合は、十分に注意してください
- まず第一に、それはアイテムではなく特定の関数を表す必要があります。Pythonは一般に、サフィックスMixinを持つミックスインクラスに名前を付けます
- 次に、単一の責任を負う必要があります。複数の関数がある場合は、複数のMixinクラスを記述します。クラスは複数のMixinを継承できます。継承の「is-a」の原則に従うことを保証するために、所属の意味を識別する親を1つだけ継承できます。クラス
- 次に、それはサブクラスの実装に依存しません
- 最後に、サブクラスがMixinクラスを継承しなくても機能しますが、特定の機能がありません。(たとえば、航空機はまだ乗客を運ぶことができますが、飛行することはできません)
2.派生
派生:子类中衍生出的新东西
1、子类独有,父类没有
2、子类有,父类也有,子类是完全覆盖父类的
3、子类有,父类也有,子类是在父类的基础上进行拓展
子クラスから派生した新しいメソッドで親クラスの機能を再利用する方法
方法1:名前付き姓が特定のカテゴリの関数を呼び出す= "継承に依存しない
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}
方法2:super()は、親クラスによって提供されるメソッドをそれ自体に呼び出します= "継承関係に厳密に依存します
super()を呼び出すと、特別なオブジェクトが取得されます。オブジェクトは、属性検索を開始したクラスのmroを参照し、現在のクラスの親クラスに移動します
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'>]