Why do we nned both - __init__() and __new__()

Ben Finney ben+python at benfinney.id.au
Thu Sep 7 08:29:38 EDT 2017


Andrej Viktorovich <viktorovichandrej at gmail.com> writes:

> For my understanding both - __init__() and __new__() works like
> constructors.

Not true, they work quite differently and have very different jobs.

> And __new__() looks is closer to constructor. __init__() is more for
> variable initialization.

That's right.

The class's ‘__new__’ method – note that it is a class method, it takes
the class as its first parameter – is the constructor. It constructs a
new instance, and its return value is that instance.

The instance's ‘__init__’ method – note that it is an instance method,
it takes the already-constructed instance as its first parameter – is
the initialiser. It acts on the existing instance, setting it up for its
initial state, and its return value is None.

> Why I can't just initialize in __init__() ?

You can. You should.

What leads you to believe otherwise?

> class ExampleClass(object):
>     def __new__(cls,value):
>         print("creating new instance with val %s" % (value,) )
>         instance = super(ExampleClass,cls).__new__(cls)
>         return instance
>     def __init__(self, value):
>         print("Initialising instance... with val %s" % (value,))
>         self.payload = value

Yes, those look fine (but for new code you should be using Python 3,
which allows you to write ‘instance = super().__new__()’).

-- 
 \         “Our urge to trust our senses overpowers what our measuring |
  `\         devices tell us about the actual nature of reality.” —Ann |
_o__)                                           Druyan, _Cosmos_, 2014 |
Ben Finney




More information about the Python-list mailing list