Jestem początkującym pytonem. Nie rozumiem dziedziczenia i __init__()
.
class Num:
def __init__(self,num):
self.n1 = num
class Num2(Num):
def show(self):
print self.n1
mynumber = Num2(8)
mynumber.show()
WYNIK: 8
To jest wporządku. Ale mogę wymienić Num2
z
class Num2(Num):
def __init__(self,num):
self.n2 = num*2
def show(self):
print self.n1,self.n2
WYNIK: Error. Num2 has no attribute "n1".
W takim przypadku, jak można Num2
uzyskać dostęp n1
?
python
inheritance
init
Yugo Kamo
źródło
źródło
__init__
metody w klasie pochodnej, jest ona dziedziczona. Dzieje się tak, ponieważ „jeśli żądany atrybut nie zostanie znaleziony w klasie, wyszukiwanie będzie kontynuowane w celu wyszukania klasy bazowej”. (doc)super(Num2, self).__init__(num)
?super
, a mój program ładuje się teraz o kilka sekund szybciej. Nie mam pojęcia dlaczego.super
ma być pomocny w przypadku dziedziczenia wielokrotnego. W przypadku pojedynczego spadku korzyści nie są oczywiste.Kiedy nadpisujesz init, musisz także wywołać init klasy nadrzędnej
super(Num2, self).__init__(num)
Zrozumienie Pythona super () z metodami __init __ ()
źródło
Ponieważ nie dzwonisz
Num.__init__
, pole „n1” nigdy nie zostanie utworzone. Zadzwoń, a wtedy będzie.źródło
Prosta zmiana w klasie Num2, taka jak ta:
super().__init__(num)
Działa w 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()
źródło