メソッドのオーバーライド(再考)
CoddyのPythonジャーニー「Object Oriented Programming」セクションの一部 — レッスン 23/64。
ポリモーフィズムは「多くの形態」を意味し、異なるクラスのオブジェクトが同じメソッド呼び出しに対して異なる応答をすることを可能にします。メソッドのオーバーライドがこれを可能にします。
メソッドを持つ親クラスは次の通りです:
class Animal:
def speak(self):
return "Animal makes a sound"同じメソッドをオーバーライドする子クラスを作成します:
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class Cow(Animal):
def speak(self):
return "Moo!"各子クラスは、speak() の独自の実装を提供します。
さまざまな動物のリストを作成します:
animals = [Dog(), Cat(), Cow(), Animal()]すべてのオブジェクトで同じメソッドを呼び出す:
for animal in animals:
print(animal.speak())出力:
Woof!
Meow!
Moo!
Animal makes a soundこれはポリモーフィズムの実際の動作です。同じメソッド呼び出しが、オブジェクトの実際の型に基づいて異なる振る舞いをします。
関数でポリモーフィズムを使用することもできます:
def make_animal_speak(animal):
print(animal.speak())
dog = Dog()
cat = Cat()
make_animal_speak(dog) # ワンワン!
make_animal_speak(cat) # ニャー!この関数は、受け取る動物の種類を知る必要はありません。単に speak() を呼び出すだけで、適切な振る舞いを得ることができます。
重要なポイント:ポリモーフィズムにより、共通のインターフェースを通じて異なるオブジェクトを同じように扱うことができます。メソッドのオーバーライドは異なる実装を提供し、ポリモーフィズムはそれらを一律に呼び出すことを可能にします。これにより、コードの柔軟性が高まり、拡張が容易になります。
チャレンジ
中級このチャレンジでは、車両の継承システムを実装します。
以下のファイルを編集する必要があります:
vehicle.py: メーカー(make)とモデル(model)の属性、およびメソッドを持つ基本のVehicleクラスを実装します。car.py:Vehicleを継承するCarクラスを作成します。motorcycle.py:Vehicleを継承するMotorcycleクラスを作成します。truck.py:Vehicleを継承するTruckクラスを作成します。
各ファイルには、実装をステップバイステップで進めるための詳細な TODO コメントが含まれています。ファイル間で必要な import 文に注意し、継承関係に従ってください。driver.py ファイルには、すべての車両タイプで実装が正しく動作することを確認するためのテストケースが含まれています。
チートシート
ポリモーフィズム(多態性)により、メソッドのオーバーライドを通じて、異なるクラスのオブジェクトが同じメソッド呼び出しに対して異なる応答をすることができます。
メソッドを持つ親クラスを作成します:
class Animal:
def speak(self):
return "Animal makes a sound"子クラスで同じメソッドをオーバーライドします:
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"異なるオブジェクトに対して同じメソッドを呼び出します:
animals = [Dog(), Cat(), Animal()]
for animal in animals:
print(animal.speak()) # それぞれが異なる出力を表示します関数でポリモーフィズムを使用します:
def make_animal_speak(animal):
print(animal.speak())
make_animal_speak(Dog()) # Woof!
make_animal_speak(Cat()) # Meow!ポリモーフィズムを使用すると、共通のインターフェースを通じて異なるオブジェクトを同じように扱うことができ、コードの柔軟性が高まり、拡張が容易になります。
自分で試してみよう
from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from truck import Truck
def vehicle_info(vehicle):
return f"{vehicle.make} {vehicle.model}: {vehicle.start()}, Efficiency: {vehicle.fuel_efficiency()} mpg"
# さまざまな車両でテスト - このテストコードは変更しないでください
vehicles = [
Car("Toyota", "Camry"),
Motorcycle("Harley", "Davidson"),
Truck("Ford", "F-150"),
Vehicle("Generic", "Vehicle")
]
for v in vehicles:
print(vehicle_info(v))このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。