を呼び出すクラスがあるとしましょう__new__
。mro をうまく操作し、__new__
必要に応じて (引数を使用して) スーパー クラスを呼び出しobject.__new__
、追加の引数を使用しないようにするにはどうすればよいでしょうか? たとえば、これはコンストラクターに引数を渡さない場合にのみ機能します。
class A(object):
def __new__(cls, *args, **kwargs):
print("A.__new__ called")
return super(A, cls).__new__(cls, *args, **kwargs)
class B(object):
def __new__(cls, *args, **kwargs):
print("B.__new__ called")
return super(B, cls).__new__(cls, *args, **kwargs)
class C(A, B): pass
>>> C.mro()
[__main__.C, __main__.A, __main__.B, builtins.object]
>>> C()
A.__new__ called
B.__new__ called
ただし、引数を指定して呼び出すと失敗します (ある時点で、Python がobject.__new__
呼び出し元クラス以外のパラメーターを受け入れないように変更されたため)。
>>> C(1)
A.__new__ called
B.__new__ called
Traceback (most recent call last):
...
TypeError: object() takes no parameters
ではA
、B
彼らのスーパークラスがobject
. 私は何かをする必要がありますsuper(A, cls).__new__ is object.__new__
か?それを確認しmro()[1] == builtins.object
ますか?それとも、「A はスーパー クラスを適切に呼び出そうとしない__new__
」と判断する必要がありますか(たとえば、実行することによってreturn object.__new__(cls)
)?
編集: クラスがカスタム メソッドを定義する場合__init__
、Python 2.6 と Python 2.7 はそれで問題ありませんが、Python 3 ではまだ動作しません。