いいえ、あなたがすることはできません。呼び出しではsuper()
、オーバーライドされたメソッドの基本クラスを検索するために、メソッドがどのクラスに属しているかを知る必要があります。
を渡した場合self.__class__
(またはさらに良い場合type(self)
)は、メソッドを検索するための間違ったsuper()
開始点が与えられ、最終的に独自のメソッドを再度呼び出すことになります。
メソッド解決順序シーケンスを形成するクラスのリスト内のポインターとして参照してください。渡すとtype(self)
、ポインターは元の開始点ではなく、サブクラスを参照します。
次のコードでは、無限再帰エラーが発生します。
class Base(object):
def method(self):
print 'original'
class Derived(Base):
def method(self):
print 'derived'
super(type(self), self).method()
class Subclass(Derived):
def method(self):
print 'subclass of derived'
super(Subclass, self).method()
デモ:
>>> Subclass().method()
subclass of derived
derived
derived
derived
<... *many* lines removed ...>
File "<stdin>", line 4, in method
File "<stdin>", line 4, in method
File "<stdin>", line 4, in method
RuntimeError: maximum recursion depth exceeded while calling a Python object
ですので、type(self)
ありません。Subclass
Derived
Derived.method()
この例では、 の MROSubclass
は[Subclass, Derived, Base]
であり、super()
オーバーライドされたメソッドの検索を開始する場所を知る必要があります。youを使用しtype(self)
て から開始するように指定すると、次の場所Subclass
が検索されますDerived.method()
。