0Pricing
Python Academy · レッスン

多重継承と MRO

多重継承と Python の MRO(C3 線形化)を理解します。

「多重継承と MRO」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

導入

Pythonは多重継承をサポートしています。メソッド解決順序(MRO)によって、名前が衝突したときにどのメソッドを呼び出すかが決まります。

多重継承の構文

class C(A, B): は A と B の両方を継承します。C は両方のクラスのすべてのメソッドを取得します。
class A:
    def hello(self): return 'A'
class B:
    def world(self): return 'B'
class C(A, B): pass
c = C()
print(c.hello(), c.world())

メソッド解決順序(MRO)

MRO は検索順序を定義します。C.__mro__ には順序が C、A、B、object と表示されます。一致するメソッドを持つ最初のクラスが選ばれます。
class A:
    def greet(self): return 'A'
class B:
    def greet(self): return 'B'
class C(A, B): pass
print(C().greet())  # A wins
print(C.__mro__)

C3線形化

PythonはC3線形化を使ってMROを計算します。これにより、子クラスが親クラスより先になり、多重継承では左から右になることが保証されます。
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print([c.__name__ for c in D.__mro__])

ダイヤモンド継承

BとCがどちらもAを継承する D(B,C) は、ダイヤモンド問題と呼ばれます。C3によって、Aの __init__ が1回だけ呼び出されることが保証されます。
class A:
    def __init__(self): print('A')
class B(A):
    def __init__(self): super().__init__(); print('B')
class C(A):
    def __init__(self): super().__init__(); print('C')
class D(B, C):
    def __init__(self): super().__init__(); print('D')
D()

ミックスイン

ミックスインは多重継承用に設計されたクラスです。単独で完全なクラスとして機能するのではなく、メソッドを追加します。
class JSONMixin:
    def to_json(self):
        import json
        return json.dumps(vars(self))
class User(JSONMixin):
    def __init__(self, name, age): self.name,self.age=name,age
print(User('Alice', 30).to_json())

ミックスインの設計ルール

ミックスインは、__init__ を持たず、ミックスイン以外のクラスを継承せず、1つのことだけを行うようにします。名前の末尾にはMixinを付けます。
class LoggingMixin:
    def log(self, msg): print(f'[{self.__class__.__name__}] {msg}')
class Service(LoggingMixin):
    def run(self): self.log('running')
Service().run()

多重継承でのsuper()

super() は直接の親クラスとは限らず、MRO上の次のクラスを呼び出します。協調的に動作させるには、各クラスが super() を呼び出す必要があります。
class Base:
    def action(self): return 'Base'
class A(Base):
    def action(self): return 'A->' + super().action()
class B(Base):
    def action(self): return 'B->' + super().action()
class C(A, B):
    def action(self): return 'C->' + super().action()
print(C().action())

動的なクラス作成のためのtype()

type('NewClass', (Base,), {'method': fn}) はクラスを動的に作成します。メタプログラミングに便利です。
def hello(self): return 'hello'
MyClass = type('MyClass', (object,), {'hello': hello})
print(MyClass().hello())

MROの確認

ClassName.__mro__ または inspect.getmro(ClassName) を使うと、クラスのタプルとして解決順序を確認できます。
class A: pass
class B(A): pass
class C(B): pass
import inspect
print([c.__name__ for c in inspect.getmro(C)])

多重継承を避ける場合

複雑な多重継承階層は理解しにくくなります。深い階層よりも、コンポジションや単純なミックスインを優先します。
# Prefer:
class User:
    def __init__(self, name, logger):
        self.name = name
        self.logger = logger  # composition
print('composition preferred')

クイックチェック

Pythonがメソッド解決順序を計算するために使用するアルゴリズムは何ですか?

復習

多重継承では、class C(A, B)のように定義します。MROはC3線形化によって決まり、メソッド検索の順序を定めます。多重継承を整理して使うには、ミックスインを利用します。super()はMROに従います。

学習を続ける

素晴らしい進み具合です。次の概念を身につけるために、このまま学習を続けてください。

よくある質問

「多重継承と MRO」レッスンは無料ですか?

はい。「多重継承と MRO」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「多重継承と MRO」で何を学びますか?

多重継承と Python の MRO(C3 線形化)を理解します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「多重継承と MRO」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 単一継承
  2. メソッドのオーバーライドと super()
  3. 多重継承と MRO
  4. ポリモーフィズムとダックタイピング
← Python Academyに戻る