17

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.

bandana
  • 3,422
  • 6
  • 26
  • 30
  • 3
    This is a terrible design. Folks trying to read and maintain your code will be baffled. Please use ordinary methods with ordinary names. Have `__init__` call another method (e.g., `reset`) so it's clear what's going on. – S.Lott Jan 27 '10 at 11:25
  • https://stackoverflow.com/questions/45798899/preferred-way-of-resetting-a-class-in-python could be the best answer to this question. To re-initialize, you could reset it. – JUNPA Jun 15 '22 at 00:54

3 Answers3

15

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__!-).

Alex Martelli
  • 854,459
  • 170
  • 1,222
  • 1,395
6

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)
Claudiu
  • 224,032
  • 165
  • 485
  • 680
  • +1: please do not call `__init__` It violates the expectations of everyone reading and maintaining your code. It's simply bad design. – S.Lott Jan 27 '10 at 11:24
1

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.

Max Shawabkeh
  • 37,799
  • 10
  • 82
  • 91