Python Forum
Is it mandatory to call superclass init inside the class init?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Is it mandatory to call superclass init inside the class init?
#1
Hello all,

Given a class A and a class B inherited from A, is it mandatory to call A.__init__(self) from B __init__ or could be possible to call it in other function?

Thank you in advance!
Reply
#2
No it is not mandatory, it is not even mandatory to call it from another function. However if you start doing strange manipulations at instance's initialization, it probably means that this class hierarchy is not the best one for your problem.
Reply
#3
No it is not, but it is good practice to do so and it is the expected way things work...

The __init__ function is used to set everything up when you create an instance of the class, so users of class B will assume that this has been done and if not, then it may produce bugs or side effects the user does not understand.

Furthermore if the developer of class A changes the implementation and now requires __init__ to be called in order for it to work correctly it will cause unknown issues for the use of class B.

Lots of time can be lost in tracking down and fixing bugs in this kind of situation, so best stick to the usual practice unless there is a very very good reason for doing so.
There is no passion to be found playing small - in settling for a life that is less than the one you are capable of living.
Reply
#4
It's not mandatory. But if you want the A.__init__ method to handle its own initialization and B.__init__() just something bit more, you wave to call it.

And the proper way is to call super():

class B(A):
    def __init__(self):
        super.__init__() # instead of A.__init(self)
When you use multiple inheritances don't calling super() could cause some issues.

In [1]: class A:
   ...:     def __init__(self):
   ...:         print('A')
   ...:

In [2]: class B(A):
   ...:     def __init__(self):
   ...:         A.__init__(self)
   ...:         print('B')
   ...:

In [3]: class C(A):
   ...:     def __init__(self):
   ...:         A.__init__(self)
   ...:         print('C')
   ...:

In [4]: class D(B, C):
   ...:     def __init__(self):
   ...:         B.__init__(self)
   ...:         C.__init__(self)
   ...:         print('D')
   ...:

In [5]: obj = D()
A
B
A
C
As you can see A is called twise.
"As they say in Mexico 'dosvidaniya'. That makes two vidaniyas."
https://freedns.afraid.org
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  How do I call sys.argv list inside a function, from the CLI? billykid999 3 752 May-02-2023, 08:40 AM
Last Post: Gribouillis
  How to call a class in other class? 3lnyn0 3 889 Oct-24-2022, 09:18 AM
Last Post: GenTorossi
  PyRun_SimpleFile calling multiprocessing Python Class cause endless init loop Xeno 2 988 Sep-19-2022, 02:32 AM
Last Post: Xeno
  Init an indefinite number of class MathisDELAGE 9 2,226 Feb-18-2022, 07:49 PM
Last Post: deanhystad
  Basic Inheritance, Why Use init udinjelek 5 2,127 Sep-29-2021, 06:03 PM
Last Post: deanhystad
  Practice problem using lambda inside the class jagasrik 3 2,106 Sep-12-2020, 03:18 PM
Last Post: deanhystad
  superclass and super() grkiran2011 1 1,690 Jun-20-2020, 04:37 AM
Last Post: deanhystad
  Error: How to to close and restart your shell after running 'conda init' angelica 3 10,174 May-27-2020, 10:00 AM
Last Post: snippsat
  How to read file inside class Mekala 11 12,248 May-02-2020, 11:36 AM
Last Post: snippsat
  Call a .xlsx file outside a class criscferr 2 1,822 Apr-24-2020, 04:23 PM
Last Post: criscferr

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020