Python Academy · レッスン

メソッドのオーバーライドと super()

親クラスのメソッドをオーバーライドし、super() で呼び出します。

レッスン 2/414 ステップ

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

導入

メソッドのオーバーライドを使うと、子クラスで継承した動作をカスタマイズできます。super() を使うと、元の実装を呼び出せます。

オーバーライドの基本

子クラスで同じメソッド名を定義すると、子クラスのすべてのインスタンスに対して親クラスのバージョンを置き換えられます。
class Greeter:
    def greet(self): return 'Hello'
class FormalGreeter(Greeter):
    def greet(self): return 'Good day'
print(FormalGreeter().greet())

オーバーライドでのsuper()

子クラス内の super().greet() は親クラスのバージョンを呼び出します。動作を完全に置き換えるのではなく、拡張するときに便利です。
class Logger:
    def log(self, msg): print(f'[LOG] {msg}')
class TimedLogger(Logger):
    def log(self, msg):
        import time
        super().log(f'{time.time():.0f}: {msg}')
TimedLogger().log('test')

__init__でのsuper()

親クラスの初期化が確実に実行されるように、子クラスの __init__ では必ず super().__init__() を呼び出します。
class Animal:
    def __init__(self, name): self.name = name
class Cat(Animal):
    def __init__(self, name, indoor):
        super().__init__(name)
        self.indoor = indoor
cat = Cat('Whiskers', True)
print(cat.name, cat.indoor)

引数付きのsuper()

super(ChildClass, self) は明示的な形式です(Python 2形式)。Python 3では、ほとんどの場合、引数なしの super() を使えます。
class A:
    def greet(self): return 'A'
class B(A):
    def greet(self): return super().greet() + 'B'
class C(B):
    def greet(self): return super().greet() + 'C'
print(C().greet())

協調的な継承

多重継承では、super() はMROに従います。すべてのクラスが super() を呼び出すことで、継承チェーン内のすべてのクラスが初期化されます。
class A:
    def __init__(self): print('A init')
class B(A):
    def __init__(self): super().__init__(); print('B init')
class C(A):
    def __init__(self): super().__init__(); print('C init')
class D(B, C):
    def __init__(self): super().__init__(); print('D init')
D()

__str__のオーバーライド

子クラスで __str__ をオーバーライドすると、インスタンスの表示方法をカスタマイズできます。
class Animal:
    def __init__(self, name): self.name = name
    def __str__(self): return f'Animal: {self.name}'
class Dog(Animal):
    def __str__(self): return f'Dog: {self.name}'
print(Dog('Rex'))

テンプレートメソッドパターン

親クラスがアルゴリズムの骨格を定義し、子クラスが特定のメソッドをオーバーライドして各ステップを実装します。
class DataProcessor:
    def process(self):
        data = self.load()
        return self.transform(data)
    def load(self): return [1,2,3]
    def transform(self, d): return d
class Doubler(DataProcessor):
    def transform(self, d): return [x*2 for x in d]
print(Doubler().process())

兄弟クラスのメソッドの呼び出し

super() と適切なMROを使うと、多重継承で兄弟クラスのメソッドを呼び出せます。これを協調的なsuper()と呼びます。
class A:
    def hello(self): print('A')
class B(A):
    def hello(self): super().hello(); print('B')
class C(A):
    def hello(self): super().hello(); print('C')
class D(B,C):
    def hello(self): super().hello(); print('D')
D().hello()

__init_subclass__

__init_subclass__ は、クラスがサブクラス化されるたびに呼び出されます。プラグイン登録パターンに便利です。
class Plugin:
    registry = []
    def __init_subclass__(cls, **kw):
        super().__init_subclass__(**kw)
        Plugin.registry.append(cls)
class A(Plugin): pass
class B(Plugin): pass
print([c.__name__ for c in Plugin.registry])

オーバーライドしない場合

動作を変更する必要がなければ、オーバーライドしないでください。不要なオーバーライドは保守の負担になります。関連性のない動作には、継承よりコンポジションを優先します。
# Good: only override what's needed
class Dog(Animal):
    def speak(self): return 'Woof'
    # No need to override __init__ if parent's is fine
print('override guidance')

確認問題

Python 3で、メソッド内の引数なしの super() は何を参照しますか?

復習

子クラスで再定義するとオーバーライドできます。super().method() は親クラスのバージョンを呼び出します。super().__init__() は親クラスを初期化します。協調的なsuper()はMROの順序に従います。

続けましょう

すばらしい進歩です!次の概念を身につけるために、そのまま続けましょう。
無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
76
レッスン
320

よくある質問

「メソッドのオーバーライドと super()」レッスンは無料ですか?

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

「メソッドのオーバーライドと super()」で何を学びますか?

親クラスのメソッドをオーバーライドし、super() で呼び出します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「メソッドのオーバーライドと super()」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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