Menu
Coddy logo textTech

多重継承

CoddyのPythonジャーニー「Object Oriented Programming」セクションの一部 — レッスン 20/64。

多重継承により、クラスは複数の親クラスから継承することができ、異なるソースからの機能を組み合わせることが可能になります。

以下に2つの親クラスがあります:

class Animal:
    def __init__(self, name):
        self.name = name
    
    def eat(self):
        return f"{self.name} is eating"

class Flyable:
    def fly(self):
        return f"{self.name} is flying"

両方の親クラスから継承する子クラスを作成します:

class Bird(Animal, Flyable):
    def __init__(self, name, species):
        super().__init__(name)  # Animalの__init__を呼び出します
        self.species = species
    
    def sing(self):
        return f"{self.name} is singing"

構文 class Bird(Animal, Flyable): は、Bird が Animal と Flyable の両方を継承していることを意味します。

birdオブジェクトを作成し、両方の親のメソッドを使用します:

sparrow = Bird("Sparrow", "House sparrow")

最初の親クラスのメソッドを呼び出します:

print(sparrow.eat())

2番目の親クラスのメソッドを呼び出します:

print(sparrow.fly())

鳥自身のメソッドを呼び出します:

print(sparrow.sing())

出力:

Sparrow is eating
Sparrow is flying
Sparrow is singing

継承順序を確認できます:

print(Bird.__mro__)  # メソッド解決順序 (Method Resolution Order)

これは、メソッドを探す際にどの親が最初にチェックされるかを示しています。

重要ポイント: 多重継承は class Child(Parent1, Parent2): 構文を使用します。子クラスはすべての親クラスからすべてのメソッドを継承します。Pythonはメソッドを探す際、親クラスを左から右の順にチェックします。

challenge icon

チャレンジ

中級

このチャレンジでは、スマートフォンを使用した多重継承を実証する、複数ファイルで構成されるクラスシステムを実装します。コードの整理を容易にするため、各クラスは独自のファイルに構成されています。

以下のファイルを編集する必要があります。

  • device.py - Deviceベースクラスを実装します
  • internet.py - Internetベースクラスを実装します
  • smartphone.py - 両方のベースクラスを継承する Smartphoneクラスを実装します
  • driver.py - 実装が正しく動作することを確認するためのテストケースを実装します

各ファイルには、実装をステップバイステップでガイドする詳細なTODOコメントが含まれています。

チートシート

多重継承を使用すると、class Child(Parent1, Parent2): という構文を使用して、クラスが複数の親クラスから継承できるようになります。

class Animal:
    def __init__(self, name):
        self.name = name
    
    def eat(self):
        return f"{self.name} is eating"

class Flyable:
    def fly(self):
        return f"{self.name} is flying"

class Bird(Animal, Flyable):
    def __init__(self, name, species):
        super().__init__(name)  # Animalの__init__を呼び出す
        self.species = species
    
    def sing(self):
        return f"{self.name} is singing"

子クラスは、すべての親クラスからすべてのメソッドを継承します:

sparrow = Bird("Sparrow", "House sparrow")
print(sparrow.eat())   # Animalクラスから
print(sparrow.fly())   # Flyableクラスから
print(sparrow.sing())  # Bird自身のメソッド

メソッド解決順序(MRO)を確認して、どの親が最初にチェックされるかを確認します:

print(Bird.__mro__)  # 継承の順序を表示します

自分で試してみよう

# TODO: smartphone.pyからSmartphoneクラスをインポートする

# スマートフォンを作成し、そのメソッドをテストする
# TODO: ブランド「Apple」、モデル「iPhone 13」のSmartphoneオブジェクトを作成する
my_phone = None

# TODO: スマートフォンのpower_on()メソッドを呼び出して表示する

# TODO: スマートフォンのconnect()メソッドを呼び出して表示する

# TODO: パラメータ「123-456-7890」を指定してスマートフォンのmake_call()メソッドを呼び出し、表示する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Object Oriented Programmingのすべてのレッスン