を使用しsuper
ます。私の知る限り、これが目的です...
まず、いくつかの提案された読書:
- スーパーは有害でスーパーと見なされます(同時に-さまざまな人々によって)
次に、例:
class A(object):
def __init__(self, x):
print "Called A"
self.a=x
class B(A):
def __init__(self, x):
print "Called B"
super(B,self).__init__(x)
self.b=x
class C(A):
def __init__(self, x):
print "Called C"
super(C,self).__init__(x)
self.c=x
class D(B,C):
def __init__(self, x):
print "Called D"
super(D,self).__init__(x)
self.d=x
foo = D(10)
コメントで述べられているように、スーパー定義を使用して任意の数の位置引数とキーワード引数を受け入れるメソッドがよく見られます。
def mymethod(self,*args,**kwargs):
super(thisclass,self).method(*args,**kwargs)
...
これによりsuper
、必要な/不要な引数を継承チェーン内の他のオブジェクトに渡すことができます。super
これらのメソッドは、必要な引数を決定し、残りを無視することができます(もちろん次の引数に渡します)
最後に、この説明を完了するには、python2.xとpython3.xについて説明する必要があります。python2.xでは、すべてのクラスが新しいスタイルである必要があります(object
最終的には継承する必要があります)。python3.xでは、これは自動です。また、python3.xでは、への引数を省略できますsuper
。
super().__init__(*args,**kwargs)
super()
ただし、python2.xとpython3.xの両方で機能するため、python2.xスタイルを好みます。また、 (python3.xスタイル)が基になるメソッドに渡すオブジェクトをどのように知っているのか、常に疑問に思っていますself
。私にはpython2.xバージョンよりもはるかに魔法のようです...