継承
継承はオブジェクト指向プログラミングにおける強力な概念です。コードを組織化する方法であり、特に関連する複数のクラスがある場合に有用です。継承を使用することで、あるクラスが他のクラスからすべてのメソッドやプロパティを継承し、コードの再利用性を高め、クラス間の論理的な関係を促進します。
Pythonでの継承の使い方を示すために、動物園を例に考えてみましょう。動物園には犬、猫、鳥など様々な動物がいます。これらの動物はそれぞれ独自の行動を持っていますが、共通の特徴も共有しています。このような場合、継承を活用することでコードの重複を避け、コードをより整理できます。具体的に見てみましょう:
class Animal: # 基底クラス Animal の定義
def __init__(self, name, age): # name と age を受け取るコンストラクタ
self.name = name # name 属性の割り当て
self.age = age # age 属性の割り当て
def eat(self): # 共通のメソッド eat
return f'{self.name} is eating.'
def make_sound(self): # 共通のメソッド make_sound
return f'{self.name} makes a sound.'
class Dog(Animal): # Animal を継承したクラス Dog の定義
def make_sound(self): # make_sound メソッドのオーバーライド
return f'{self.name} barks.'
class Cat(Animal): # Animal を継承したクラス Cat の定義
def make_sound(self): # make_sound メソッドのオーバーライド
return f'{self.name} meows.'
class Bird(Animal): # Animal を継承したクラス Bird の定義
def eat(self): # Bird 専用に eat メソッドをオーバーライド
return f'{self.name} is pecking at its food.'
def make_sound(self): # make_sound メソッドのオーバーライド
return f'{self.name} chirps.'
# __init__ メソッドは Animal から継承されています
# しかし、継承先のクラスで __init__ を定義することもできます
dog = Dog('Rex', 5) # Dog のインスタンスを作成
cat = Cat('Whiskers', 3) # Cat のインスタンスを作成
bird = Bird('Tweety', 2) # Bird のインスタンスを作成
for animal in [dog, cat, bird]: # インスタンスを反復処理
print(animal.eat()) # 継承またはオーバーライドされた eat メソッドを呼び出し
print(animal.make_sound()) # オーバーライドされた make_sound メソッドを呼び出し
print('-----')
このコードの出力は次のとおりです:
Rex is eating.
Rex barks.
-----
Whiskers is eating.
Whiskers meows.
-----
Tweety is pecking at its food.
Tweety chirps.
-----
上記のコードでは、
Animal
が親クラスであり、Dog
、Cat
、Bird
が子クラスです。子クラスは Animal
クラスからすべてのメソッドを継承していますが、各子クラスは独自の動物が出す音のために make_sound
メソッドをオーバーライドしています。また、Bird
クラスでは eat
メソッドもオーバーライドしています。これは、鳥の食事方法が Animal
クラスで定義された一般的な食事行動と異なるためです。このアプローチにより、現実世界のオブジェクトとその関係をより効果的に表現でき、明確で簡潔、そして保守しやすいコードベースを作成できます。つまり、継承を活用することで、コードの再利用性を高め、複雑さを減少させることができます。
チャレンジ:Person と Employee クラス
Person
と Employee
の2つのクラスを作成してください。Person
クラスは次の属性を持ちます:name
: 人の名前を表す文字列。
age
: 人の年齢を表す整数。
Person
クラスは次のメソッドも持ちます:introduce_yourself()
: このメソッドは次の形式の文字列を出力します:"My name is {name} and I am {age} years old."
Employee
クラスは Person
クラスを継承し、次の属性を追加します:job_title
: 人の職業タイトルを表す文字列。
Employee
クラスは次のメソッドをオーバーライドします:introduce_yourself()
: このメソッドは次の形式の文字列を出力します:"My name is {name}, I am {age} years old, and my job title is {job_title}."
入力 | 出力 |
alice=Person('Alice', 25); alice.introduce_yourself(); bob=Employee('Bob', 30, 'Engineer'); bob.introduce_yourself(); | My name is Alice and I am 25 years old.
My name is Bob, I am 30 years old, and my job title is Engineer. |
Constraints
Time limit: 2 seconds
Memory limit: 512 MB
Output limit: 1 MB