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 Retrieversuper() を使用して親メソッドを拡張します:
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__ メソッドの呼び出しや、親の振る舞いの拡張が含まれます。
チャレンジ
中級このチャレンジでは、継承を使用して 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 = breedsuper() を使用してメソッドを拡張する:
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()このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。