__new__
機能を使用して、サブクラスの__init__
機能にコードを注入することに興味があります。ドキュメントから私の理解は、__new__
によって返されるインスタンス上の__init__
を呼び出すということです。しかし、__init__
の値を__new__
から返す前のインスタンスに変更しようとする私の努力はうまくいかないようです。__new__を使用してサブクラスで__init__を上書きする
class Parent(object):
def __new__(cls, *args, **kwargs):
new_object = super(Parent, cls).__new__(cls)
user_init = new_object.__init__
def __init__(self, *args, **kwargs):
print("New __init__ called")
user_init(self, *args, **kwargs)
self.extra()
print("Replacing __init__")
setattr(new_object, '__init__', __init__)
return new_object
def extra(self):
print("Extra called")
class Child(Parent):
def __init__(self):
print("Original __init__ called")
super(Child, self).__init__()
c = Child()
上記のコードを印刷:
Replacing __init__
Original __init__ called
が、私はそれが
Replacing __init__
New __init__ called
Original __init__ called
Extra called
なぜを印刷するように期待?
私は、__init__
の元の値を__new__
に設定しているかどうかにかかわらず、Pythonが元の値を呼び出すように感じます。 c.__init__
でイントロスペクションを実行すると、新しいバージョンが存在することが示されますが、オブジェクトの作成の一部として呼び出されていません。
あなたの質問はありますか? – cat