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)も、状況に応じて柔軟なメソッド定義を可能にします。