Python での多重継承
継承により、子クラスで親クラスの機能を使用できるようになり、オブジェクト指向プログラミングの重要な機能になります。これは、親クラスから子クラスへのデータの再利用性と推移性を支援し、データの損失を補います。
多重継承とは、子クラスが 2つ以上の親クラスからメソッドと機能を継承する場合です。すべてのデータを一度に導出することは有益です。それでも、一方で、使用法の複雑さとあいまいさが伴います。複数の親が同じ機能を持っている場合、どの機能がどの親からのものであるかを判断するのはあいまいです。多重継承が正しく使用または実装されていない場合に発生します。仮想継承、メソッド解決順序(MRO)の使用、および super()
関数は、何らかの形でそのリスクを軽減できます。
次のコードに、多重継承の基本的な例を示します。
class Father:
def drive(self):
print("Father drives his son to school")
class Mother:
def cook(self):
print("Mother loves to cook for her son")
class Son(Father, Mother):
def love(self):
print("I love my Parents")
c = Son()
c.drive()
c.cook()
c.love()
出力:
Father drives his son to school
Mother loves to cook for her son
I love my parents
子クラス Son
は親クラス Father
と Mother
から派生し、関数 drive()
と cook()
を使用して目的の出力を提供できます。
super()
関数は、継承された子クラスの親クラスまたは兄弟クラスを参照し、子クラスがすべてのスーパークラスメソッドを使用できるようにする一時オブジェクトを返します。
これは通常、継承がパスを横断し始めたとき、つまり 2つの親クラスもスーパー基本クラスから派生したときにあいまいな場合に行われます。
例えば、
class Animals:
def __init__(self, animalsName):
print(animalsName, "is an animal.")
class Mammal(Animals):
def __init__(self, Name):
print(Name, "is a mammal.")
super().__init__(Name)
class donotFly(Mammal):
def __init__(self, name):
print(name, "cannot fly.")
super().__init__(name)
class donotSwim(Mammal):
def __init__(self, name):
print(name, "cannot swim.")
super().__init__(name)
class Cat(donotSwim, donotFly):
def __init__(self):
print("A cat.")
super().__init__("Cat")
cat = Cat()
print("")
bat = donotSwim("Bat")
出力:
A cat.
Cat cannot swim.
Cat cannot fly.
Cat is a mammal.
Cat is an animal.
Bat cannot swim.
Bat is a mammal.
Bat is an animal.
子クラス Cat
が作成され、2つの親クラス donotswim
と donotfly
に継承されます。次に、Mammals クラスはそれらを継承します。Mammals
クラスはさらに、スーパークラス Animals
のプロパティを継承します。したがって、この場合、super()
関数を使用して、スーパークラスメソッドに簡単にアクセスしました。