Python super() 関数
super()は、Python で親クラス(スーパークラス)のメソッドを呼び出すための組み込み関数です。
クラスの継承において、super()親クラスのメソッドを呼び出して、コードの再利用とメソッドの拡張を実現できます。これは Python のオブジェクト指向プログラミングにおいて非常に重要な関数です。
単語の意味: super「スーパー」という意味で、ここでは親クラスまたはスーパークラスを指します。
基本構文とパラメータ
構文形式
super() super(type, object-or-type)
パラメータの説明
- パラメータ type:
- 型: クラス
- 説明: 親クラスのプロキシを取得するためのクラス。
- パラメータ object-or-type:
- 型: オブジェクトまたはクラス
- 説明: type のインスタンスまたはサブクラスである必要があります。
関数の説明
- 戻り値: 親クラスのメソッドを呼び出すためのプロキシオブジェクトを返します。
- 特徴: メソッド解決順序(MRO)をサポートし、多重継承を正しく処理できます。
例
例1:サブクラスで親クラスのコンストラクタを呼び出す
例
# 父类
class Animal:
def __init__(self, name):
self.name = name
print(f動物 {self.name} が生まれました)
def speak(self):
print("动物发出声音")
# 子类
class Dog(Animal):
def __init__(self, name, breed):
# 親クラスの __init__ を呼び出す
super().__init__(name)
self.breed = breed
print(f"品種は {self.breed}")
def speak(self):
# 親クラスのメソッドを呼び出す
super().speak()
print("汪汪!")
# 测试
dog = Dog("小白", "哈士奇")
# 输出:
# 動物 小白 が生まれました
# 品種はハスキー
dog.speak()
# 输出:
# 动物发出声音
# 汪汪!
class Animal:
def __init__(self, name):
self.name = name
print(f動物 {self.name} が生まれました)
def speak(self):
print("动物发出声音")
# 子类
class Dog(Animal):
def __init__(self, name, breed):
# 親クラスの __init__ を呼び出す
super().__init__(name)
self.breed = breed
print(f"品種は {self.breed}")
def speak(self):
# 親クラスのメソッドを呼び出す
super().speak()
print("汪汪!")
# 测试
dog = Dog("小白", "哈士奇")
# 输出:
# 動物 小白 が生まれました
# 品種はハスキー
dog.speak()
# 输出:
# 动物发出声音
# 汪汪!
実行結果の予想:
動物 小白 が生まれました 品種は ハスキーです 動物が音を出します ワンワン!
コード解説:
super().__init__(name)親クラスのコンストラクタを呼び出します。super().speak()親クラスのメソッドを呼び出します。- これにより、サブクラスで親クラスの機能を拡張できます。
例2:多重継承
例
# 多重继承示例
class A:
def method(self):
print("A.method")
class B(A):
def method(self):
print("B.method")
super().method() # 调用 A.method
class C(A):
def method(self):
print("C.method")
super().method() # 调用 A.method
class D(B, C):
def method(self):
print("D.method")
super().method() # 按 MRO 顺序调用
# MRO: D -> B -> C -> A
d = D()
d.method()
# 输出:
# D.method
# B.method
# C.method
# A.method
# 查看 MRO
print(D.__mro__)
class A:
def method(self):
print("A.method")
class B(A):
def method(self):
print("B.method")
super().method() # 调用 A.method
class C(A):
def method(self):
print("C.method")
super().method() # 调用 A.method
class D(B, C):
def method(self):
print("D.method")
super().method() # 按 MRO 顺序调用
# MRO: D -> B -> C -> A
d = D()
d.method()
# 输出:
# D.method
# B.method
# C.method
# A.method
# 查看 MRO
print(D.__mro__)
実行結果の予想:
D.method B.method C.method A.method (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
コード解説:
super()MRO(メソッド解決順序)に従って呼び出します。- これにより、多重継承の正確性が保証されます。
例3:パラメータを使用しない(推奨)
例
# Python 3 推荐用法:无需参数
class Parent:
def greet(self, name):
return f"你好, {name}!"
class Child(Parent):
def greet(self, name):
# 调用父类方法并扩展
message = super().greet(name)
return message + " 欢迎回来!"
child = Child()
print(child.greet("Tom"))
# 输出: 你好, Tom! 欢迎回来!
class Parent:
def greet(self, name):
return f"你好, {name}!"
class Child(Parent):
def greet(self, name):
# 调用父类方法并扩展
message = super().greet(name)
return message + " 欢迎回来!"
child = Child()
print(child.greet("Tom"))
# 输出: 你好, Tom! 欢迎回来!
実行結果の予想:
実際の環境で実行すると、拡張された挨拶文が表示されます。
super()は、Python でクラスの継承とポリモーフィズムを実現するための重要な関数です。
その他の拡張