bandana
bandana

Reputation: 3612

Python: multiple calls to __init__() on the same instance

The __init__() function gets called when object is created. Is it ok to call an object __init__() function again, after its been created?

instance = cls(p1=1, p2=2)
# some code
instance.__init__(p1=123, p2=234)
# some more code
instance.__init__(p1=23, p2=24)

why would anyone wanna call __init__() on an object that is already created?

good question. i wanna re-initialize the instance's fields.

Upvotes: 17

Views: 17228

Answers (4)

Vicky Yan
Vicky Yan

Reputation: 1

From my tries, I figured out it would not cause an error if you call an object __init__ function again after it's being created. You will just reinitialize the object's attributes, and the previously defined __init__ would be overwritten. However, it's not common and meaningful to do so. It would also confuse other people when reading your code. If you want to reset your instance, you could do so by defining a separate method or function.

Upvotes: 0

Alex Martelli
Alex Martelli

Reputation: 881785

It's fine to call __init__ more than once on an object, as long as __init__ is coded with the effect you want to obtain (whatever that may be). A typical case where it happens (so you'd better code __init__ appropriately!-) is when your class's __new__ method returns an instance of the class: that does cause __init__ to be called on the returned instance (for what might be the second, or twentieth, time, if you keep "recycling" instances via your __new__!-).

Some additional guidance can be found here. Multiple calls to init during object initialization

Upvotes: 15

Claudiu
Claudiu

Reputation: 229391

You can, but it's kind of breaking what __init__ is intended to do. A lot of Python is really just convention, so you might as well follow then and expect __init__ to only be called once. I'd recommend creating a function called init or reset or something which sets the instance variables, use that when you want to reset the instance, and have __init__ just call init. This definitely looks more sane:

x = Pt(1,2)
x.set(3,4)
x.set(5,10)

Upvotes: 6

Max Shawabkeh
Max Shawabkeh

Reputation: 38603

As far as I know, it does not cause any problems (edit: as suggested by the kosher usage of super(...).__init__(...)), but I think having a reset() method and calling it both in __init__() and when you need to reset would be cleaner.

Upvotes: 1

Related Questions