Estoy superando el método __new__()
de una clase para devolver una instancia de clase que tiene un conjunto específico __init__()
. Python parece llamar a la __init__()
método proporcionado en su clase en lugar del método específico de la instancia, aunque la documentación de Python en¿Por qué Python no invoca el método de instancia __init __() en la creación de la instancia, sino que llama a la clase __init __()?
http://docs.python.org/reference/datamodel.html
dice:
implementaciones típicas crear una nueva instancia de la clase de invocando el método __new __() de la superclase usando super (currentclass, cls) .__ new __ (cls [, ...]) con los argumentos apropiados y luego modificando la instancia recién creada como necesaria antes de devolverla.
Si __new __() devuelve una instancia de cls, después de la nueva instancia __init __() método será invocado como __init __ (self [...]), donde el auto es la nueva instancia y las argumentos restantes son lo mismo que pasó a __new __().
Aquí está mi código de prueba:
#!/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()
que da salida a
$ 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 = {}
Parece que la única manera de conseguir myinit()
para correr, es llamarlo explícitamente como self.__init__()
myclass.__init__()
el interior.
Muy buena pregunta! – Marcin