Reputation: 3612
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
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
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
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
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