継承

継承はオブジェクト指向プログラミングにおける強力な概念です。コードを組織化する方法であり、特に関連する複数のクラスがある場合に有用です。継承を使用することで、あるクラスが他のクラスからすべてのメソッドやプロパティを継承し、コードの再利用性を高め、クラス間の論理的な関係を促進します。
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 が親クラスであり、DogCatBird が子クラスです。子クラスは Animal クラスからすべてのメソッドを継承していますが、各子クラスは独自の動物が出す音のために make_sound メソッドをオーバーライドしています。また、Bird クラスでは eat メソッドもオーバーライドしています。これは、鳥の食事方法が Animal クラスで定義された一般的な食事行動と異なるためです。
このアプローチにより、現実世界のオブジェクトとその関係をより効果的に表現でき、明確で簡潔、そして保守しやすいコードベースを作成できます。つまり、継承を活用することで、コードの再利用性を高め、複雑さを減少させることができます。

チャレンジ:Person と Employee クラス

PersonEmployee の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

To check your solution you need to sign in
Sign in to continue