特定のセット__new__()
を持つクラスインスタンスを返すために、クラスのメソッドを上書きしています。Pythonは、インスタンス固有のメソッドではなく__init__()
、クラス提供のメソッドを呼び出しているようですが、Pythonのドキュメントは__init__()
http://docs.python.org/reference/datamodel.html
言う:
一般的な実装では、super(currentclass、cls).__ new __(cls [、...])を適切な引数で使用してスーパークラスの__new __()メソッドを呼び出し、必要に応じて新しく作成されたインスタンスを変更してから、クラスの新しいインスタンスを作成します。それ。
__new __()がclsのインスタンスを返す場合、新しいインスタンスの__init __()メソッドは__init __(self [、...])のように呼び出されます。ここで、selfは新しいインスタンスであり、残りの引数はに渡されたものと同じです。 __新着__()。
これが私のテストコードです:
#!/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 = {}
実行する唯一の方法は、 insidemyinit()
として明示的に呼び出すことです。self.__init__()
myclass.__init__()