ast wrote: > Hello > > In the following code found here: > https://www.pythonsheets.com/notes/python-object.html > > __init__ is not invoked when we create an object > with "o = ClassB("Hello")". I don't understand why. > I know the correct way to define __new__ is to write > "return object.__new__(cls, arg)" and not "return object" > > > >>> class ClassB(object): > ... def __new__(cls, arg): > ... print('__new__ ' + arg) > ... return object > ... def __init__(self, arg): > ... print('__init__ ' + arg) > ... > > >>> o = ClassB("Hello") > __new__ Hello > > > Normaly, when running "o = ClassB("Hello")", we first run > __call__ from type of ClassB which is type. This __call__ > method is supposed to launch __new__ from ClassB and then > __init__ from classB too. The output of __new__ is mapped > to self parameter of __init__. > But it seems things don't work like that here. Why ?
__init__ is called only if __new__ returns an instance of ClassB: """ /* If the returned object is not an instance of type, it won't be initialized. */ if (!PyType_IsSubtype(Py_TYPE(obj), type)) return obj; type = Py_TYPE(obj); if (type->tp_init != NULL) { int res = type->tp_init(obj, args, kwds); """ https://github.com/python/cpython/blob/master/Objects/typeobject.c#L982 -- https://mail.python.org/mailman/listinfo/python-list