In the first situation, Num2 is extending the class Num and since you are not redefining the special method named __init__() in Num2, it gets inherited from Num.
When a class defines an
__init__()
method, class instantiation
automatically invokes__init__()for
the newly-created class instance.
In the second situation, since you are redefining __init__() in Num2 you need to explicitly call the one in the super class (Num) if you want to extend its behavior.
class Num2(Num):
def __init__(self,num):
Num.__init__(self,num)
self.n2 = num*2