Why does __init__() have to be used twice when I inherit from another class?
Yes, when you run root=tk.Tk()
then an instance of the class tk.Tk
is instantiated -- which means calling the __init__
of this class.
In the second method you want to create a new class -- which might be useful especially in a larger project, to be able to port it anywhere else. You cannot append something to the parent's __init__
method, you can just override it by defining it anew. So if you still want all the useful stuff to happen, which is executed in the tk.Tk.__init__()
, you have to call it explicitly.
One might argue, that a better style would be to use super()
instead of hardcoding the parent class name. But this gets relevant in still more complicated projects...
When you create a class object, it's constructor gets called automatically. This is what is happening in both snippets. The first one instantiates an object for the Tk
class so therefore the __init__
method for the Tk
class gets called. Where in the second way, you are not creating an object for the Tk
class. You are creating an object for your App
class. This does not mean it will call the constructor for the class that it has inherited from. You need to call it explicitly.