Я отменяю метод __new__()
класса для возврата экземпляра класса, для которого задан конкретный __init__()
. Кажется, что Python вызывает предоставленный классом метод __init__()
вместо метода, специфичного для экземпляра, хотя документация Python на
http://docs.python.org/reference/datamodel.html
говорит:
Типичные реализации создают новый экземпляр класса, вызывая метод суперкласса __new __ (), используя super (currentclass, cls) .__ new __ (cls [, ...]) с соответствующими аргументами, а затем при необходимости изменяя вновь созданный экземпляр перед возвратом. Это.
Если __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 = {}
Кажется, единственный способ заставить myinit()
работать - это явно вызвать его как self.__init__()
внутри myclass.__init__()
.