Python - Vererbung

HerrDrachen

Lieutenant
Registriert
Feb. 2016
Beiträge
625
Hallo,

class FeedForward(torch.nn.Module): def __init__(self, input_neurons, hidden_neurons, output_neurons): super(FeedForward,self).__init__() self.hidden = nn.Linear(input_neurons, hidden_neurons) self.out = nn.Linear(hidden_neurons,output_neurons) def forward(self, x): x = self.hidden(x) x = F.relu(x) x = self.out(x) return x


kann mir jemand bitte die 2 Zeilen erklären:
def init(self, input_neurons, hidden_neurons, output_neurons):
super(FeedForward,self).init()



Die erste Zeile ist die init Methode (Konstruktor) von der Klasse FeedFoward?
Die zweite Zeile verstehe ich nicht, was wird da gemacht?
 
FeedForward leitet sich von torch.nn.Module ab und implementiert sein eigenes __init__ und überschreibt damit das __init__ von torch.nn.Module. ohne "super" wird beim instanziieren von FeedForward nur dessen __init__ ausgeführt - alles was das __init__ von torch.nn.Module machen würde, wäre nicht vorhanden.

ohne super()
Code:
In [8]: class A(object):
   ...:     def __init__(self):
   ...:         self.a = 1
   ...:
   ...:

In [9]: class B(A):
   ...:     def __init__(self):
   ...:         self.b = 2
   ...:

In [10]: b = B()

In [11]: b.a
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-11-98be602909d9> in <module>
----> 1 b.a

AttributeError: 'B' object has no attribute 'a'

mit super()
Code:
In [13]: class B(A):
    ...:     def __init__(self):
    ...:         super().__init__()
    ...:         self.b = 2
    ...:

In [14]: b = B()

In [15]: b.a
Out[15]: 1
 
super(FeedForward,self).init()

Damit rufen wir den Konstruktor der Superklasse (torch.nn.Module) auf und übergeben FeedForward.
Was macht das self?

Anschließend kann man die Methoden von torch.nn.Module benutzen?
nn.Linear und forward in dem Fall?
 
Zuletzt bearbeitet:
die syntax super(type[, object-or-type]) brauchst du mit python3 nicht mehr (und python2.7 verwendest du hoffentlich nicht mehr). einfach super() reicht.

die funktionen deiner elternklasse sind schon alleine aufgrund der vererbung verfügbar. super() brauchst du nur, wenn du funktionen überschreibst, aber den code der elternklasse trotzdem noch ausführen willst.
 
Zurück
Oben