Reputation: 2389
I'm begginer of python. I can't understand inheritance and __init__()
.
class Num:
def __init__(self,num):
self.n1 = num
class Num2(Num):
def show(self):
print self.n1
mynumber = Num2(8)
mynumber.show()
RESULT: 8
This is OK. But I replace Num2
with
class Num2(Num):
def __init__(self,num):
self.n2 = num*2
def show(self):
print self.n1,self.n2
RESULT: Error. Num2 has no attribute "n1".
In this case, how can Num2
access n1
?
Upvotes: 132
Views: 193858
Reputation: 144
Based on this:
Can I collect and merge different answers into an accepted one? I am creating a wiki answer collecting input from above two latest answers:
Answer with code by Sacchit Jaiswal & Tom Jelen
Answer with reason or why it's needed by Mauro Rocco
When you override the init you have also to call the init of the parent class
Understanding Python super() with __init__() methods
super(Num2, self).__init__(num)
It works in python3.
class Num:
def __init__(self,num):
self.n1 = num
class Num2(Num):
def __init__(self,num):
super().__init__(num)
self.n2 = num*2
def show(self):
print (self.n1,self.n2)
mynumber = Num2(8)
mynumber.show()
Upvotes: 0
Reputation: 281
A simple change in Num2 class like this:
super().__init__(num)
It works in python3.
class Num:
def __init__(self,num):
self.n1 = num
class Num2(Num):
def __init__(self,num):
super().__init__(num)
self.n2 = num*2
def show(self):
print (self.n1,self.n2)
mynumber = Num2(8)
mynumber.show()
Upvotes: 28
Reputation: 5128
When you override the init you have also to call the init of the parent class
super(Num2, self).__init__(num)
Understanding Python super() with __init__() methods
Upvotes: 47
Reputation: 642
Since you don't call Num.__init__
, the field "n1" never gets created. Call it and then it will be there.
Upvotes: 4
Reputation: 3235
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
Upvotes: 198