Menu
Coddy logo textTech

super() 関数

CoddyのPythonジャーニー「Object Oriented Programming」セクションの一部 — レッスン 18/64。

super() 関数は、子クラスが親クラスのメソッドを呼び出すことを可能にします。これにより、親の機能を完全に置き換えるのではなく、拡張することができます。

コンストラクタで super() を使用する例を以下に示します:

class Animal:
    def __init__(self, name):
        self.name = name
        print(f"Animal created: {name}")

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # 親クラスの __init__ を呼び出す
        self.breed = breed
        print(f"Dog breed set: {breed}")

dogオブジェクトを作成します:

buddy = Dog("Buddy", "Golden Retriever")
print(f"Name: {buddy.name}, Breed: {buddy.breed}")

出力:

Animal created: Buddy
Dog breed set: Golden Retriever
Name: Buddy, Breed: Golden Retriever

super() を使用して親メソッドを拡張します:

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

class Dog(Animal):
    def make_sound(self):
        super().make_sound()  # 最初に親のメソッドを呼び出します
        print("Woof!")        # 犬固有の動作を追加します

拡張されたメソッドを呼び出します:

buddy = Dog()
buddy.make_sound()

出力:

Generic animal sound
Woof!

super() がないと、親の機能を失うことになります:

class Cat(Animal):
    def make_sound(self):
        print("Meow!")  # 猫の鳴き声のみ、親メソッドは無視される

cat = Cat()
cat.make_sound()

出力:

Meow!

重要なポイント: 子クラスから親クラスのメソッドを呼び出すには super() を使用します。これにより、機能を完全に置き換えるのではなく、拡張することができます。一般的な用途には、親の __init__ メソッドの呼び出しや、親の振る舞いの拡張が含まれます。

challenge icon

チャレンジ

中級

このチャレンジでは、継承を使用して Person クラスと Employee クラスの階層を実装します。

  • person.py: name と age 属性を持つ Person クラスが含まれています
  • employee.py: Person を継承する Employee クラスが含まれています
  • driver.py: 実装をテストするためのメインファイル

各ファイルには、実装をガイドするための詳細な TODO コメントが含まれています。

チートシート

super() 関数を使用すると、子クラスから親クラスのメソッドを呼び出すことができ、機能を置き換えるのではなく拡張することができます。

コンストラクタで super() を使用する:

class Animal:
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # 親の __init__ を呼び出す
        self.breed = breed

super() を使用してメソッドを拡張する:

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

class Dog(Animal):
    def make_sound(self):
        super().make_sound()  # 最初に親のメソッドを呼び出す
        print("Woof!")        # 子クラス固有の動作を追加する

super() を使用しない場合: 子クラスのメソッドは、親の機能を拡張する代わりに完全に置き換えてしまいます。

自分で試してみよう

# TODO: person.pyからPersonクラスをインポートする
# TODO: employee.pyからEmployeeクラスをインポートする

def main():
    # TODO: 名前が"Alice"で年齢が30のPersonオブジェクトを作成する
    person = None
    
    # TODO: 名前が"Bob"、年齢が35、職業が"Developer"のEmployeeオブジェクトを作成する
    employee = None
    
    # TODO: Personオブジェクトのintroduce()メソッドを呼び出す
    # 期待される出力: "Hi, I'm Alice and I'm 30 years old"
    
    # TODO: 空白行をプリントして間隔を空ける - print()
    
    # TODO: Employeeオブジェクトのintroduce()メソッドを呼び出す
    # 期待される出力: 
    # "Hi, I'm Bob and I'm 35 years old"
    # "I work as a Developer"

if __name__ == "__main__":
    main()
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Object Oriented Programmingのすべてのレッスン