[Python] Why doesn't Python call instance method __init__() on instance creation but calls...

Discussão em 'Python' iniciado por Stack, Julho 14, 2025.

  1. Stack

    Stack Membro Participativo

    I'm overriding the __new__() method of a class to return a class instance which has a specific __init__(). Python seems to call the class-provided __init__() method instead of the instance-specific method, although the Python documentation at

    http://docs.python.org/reference/datamodel.html

    says:


    Typical implementations create a new instance of the class by invoking the superclass’s _new_() method using super(currentclass, cls)._new_(cls[, ...]) with appropriate arguments and then modifying the newly-created instance as necessary before returning it.

    If _new_() returns an instance of cls, then the new instance’s _init_() method will be invoked like _init_(self[, ...]), where self is the new instance and the remaining arguments are the same as were passed to _new_().
    ​

    Here's my test code:

    #!/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()


    which outputs

    $ 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 = {}


    It seems the only way to get myinit() to run, is to call it explicitly as self.__init__() inside myclass.__init__().

    Continue reading...

Compartilhe esta Página