私は特定の__init__()
が設定されているクラスインスタンスを返すために、クラスのメソッド__new__()
をオーバーライドしています。Pythonはインスタンス作成時にインスタンスメソッド__init __()を呼び出さないのに対し、クラス提供の__init __()を代わりに呼び出すのはなぜですか?
典型的な実装では、クラスの新しいインスタンスを作成します。
http://docs.python.org/reference/datamodel.html
でPythonドキュメントは言うものの、Pythonは、代わりにインスタンス固有のメソッドのクラスが提供する
__init__()
メソッドを呼び出しているようですsuper(currentclass、cls).__ new __(cls [、...]) を適切な引数で使用して、 スーパークラスの__new __()自己が新しいインスタンスであり、 残りの引数は__newは__()CLSのインスタンスを返す場合、新しいインスタンスの__init __()メソッド は__init __のように呼び出されます(自己[、...])、 __new __()と同じものが渡されました。
myinit()
を実行するために取得する唯一の方法だmyclass.__init__()
内部self.__init__()
として明示的にそれを呼び出すことです#!/usr/bin/env python import new def myinit(self, *args, **kwargs): print "myinit called, args = %s, kwargs = %s" % (args, kwargs) class myclass(object): def __new__(cls, *args, **kwargs): ret = object.__new__(cls) ret.__init__ = new.instancemethod(myinit, ret, cls) return ret def __init__(self, *args, **kwargs): print "myclass.__init__ called, self.__init__ is %s" % self.__init__ self.__init__(*args, **kwargs) a = myclass()
$ python --version Python 2.6.6 $ ./mytest.py myclass.__init__ called, self.__init__ is <bound method myclass.myinit of <__main__.myclass object at 0x7fa72155c790>> myinit called, args =(), kwargs = {}
を出力します
は、ここに私のテストコードです。
グレート質問:この動作は、次のコードは、(旧スタイルのクラスと同等の例とは異なり)例外が発生した理由です! – Marcin