PYTHON MEBY

Pythonでオーバーライド・オーバーロードを実装

この記事では、Pythonにおけるオーバーライドとオーバーロードについて解説します。Pythonでは、多重継承やメソッドのオーバーライド、そしてオーバーロードの代替手段について説明します。

目次

オーバーライド

Pythonでは、子クラスが親クラスのメソッドを再定義することをオーバーライドといいます。子クラスで同じ名前のメソッドを定義することで、親クラスのメソッドの動作を変更できます。

class Animal:
    def speak(self):
        print("Generic animal sound")

class Dog(Animal):
    def speak(self):
        print("Woof!")

class Cat(Animal):
    def speak(self):
        print("Meow!")

dog = Dog()
dog.speak()  # 出力: Woof!
cat = Cat()
cat.speak()  # 出力: Meow!

上記のように、DogクラスとCatクラスはAnimalクラスのspeakメソッドをオーバーライドしています。

多重継承

Pythonは多重継承をサポートしています。複数の親クラスから継承し、それらのメソッドを組み合わせることができます。ただし、メソッド名が衝突する場合は、Method Resolution Order (MRO) に従ってメソッドが解決されます。

class Flyer:
    def fly(self):
        print("Flying!")

class Swimmer:
    def swim(self):
        print("Swimming!")

class FlyingFish(Flyer, Swimmer):
    pass

fish = FlyingFish()
fish.fly()  # 出力: Flying!
fish.swim() # 出力: Swimming!

FlyingFishクラスはFlyerとSwimmerクラスから継承しています。メソッド名が衝突していないため、問題なく動作します。メソッド名が衝突する場合は、MROを確認する必要があります。

オーバーロードの代替手段

Pythonは、C++やJavaのようなオーバーロード(同じ名前のメソッドを複数のシグネチャで定義する)を直接サポートしていません。しかし、デフォルト引数や可変長引数、辞書引数などを用いることで、オーバーロードと同様の効果を実現できます。

def greet(name, greeting="Hello"):
    print(f"{greeting}, {name}!")

greet("Alice")  # 出力: Hello, Alice!
greet("Bob", "Good morning")  # 出力: Good morning, Bob!

上記のように、デフォルト引数を使用することで、異なる引数パターンに対応できます。可変長引数(*args)や辞書引数(**kwargs)も、状況に応じて柔軟なメソッド定義を可能にします。

関連記事