使用法についてはたくさんの質問がありますがsuper()
、どれも私の質問に答えていないようです。
サブクラスから呼び出す場合super().__init__()
、スーパーコンストラクターのすべてのメソッド呼び出しは、実際にはサブクラスから取得されます。次のクラス構造を検討してください。
class A(object):
def __init__(self):
print("initializing A")
self.a()
def a(self):
print("A.a()")
class B(A):
def __init__(self):
super().__init__()
# add stuff for B
self.bnum=3 # required by B.a()
def a(self):
print("B.a(), bnum=%i"%self.bnum)
b=B()
で失敗します
initializing A
Traceback (most recent call last):
File "classmagic.py", line 17, in
b=B()
File "classmagic.py", line 11, in __init__
super().__init__()
File "classmagic.py", line 5, in __init__
self.a()
File "classmagic.py", line 15, in a
print("B.a(), bnum=%i"%self.bnum)
AttributeError: 'B' object has no attribute 'bnum'
ここでは、スーパーコンストラクターを呼び出して、B()
いくつかの基本構造を初期化します(その一部は独自の関数として実行されますa()
)。ただし、a()
関数もオーバーライドすると、この実装は、のコンストラクターを呼び出すときに使用されます。コンストラクターは、何も知らず、異なる内部変数を使用する可能性A
があるため失敗します。A
B
これは直感的である場合とそうでない場合がありますが、すべてのメソッドA
がそこに実装されている関数にのみアクセスできるようにする場合はどうすればよいですか?