Danke Dir erstmal für Deine Antwort.
Sirius3 hat geschrieben:
wobei die Beispielfunktion so sinnfrei ist, dass man daraus nicht wirklich ableiten kann, was Du eigentlich machen möchtest und wie dort die richtige Lösung aussieht.
Stimmt. Ich wollte niemandem zumuten, um mein eigentliches Problem zu verstehen, die ganze Klasse hier reinzustellen und sich durch den ganzen Code zu quälen. Daher habe ich mir nur ein kurzes Beispiel erstellt, was aber das eigentliche Problem betrifft.
Sirius3 hat geschrieben:
Was ist Dein eigentliches Problem das Du zu lösen versuchst?
Das ganze hat zwei Gründe. Zum Einen wollte ich mir den return ersparen, da diese Variablen dann noch für andere Dinge verwendet werden, hatte ich mir gedacht, wenn der Funktionsaufruf direkt, ohne eine Rückgabe, die eigentlichen Variablen ändern könnte, hätte ich mir den Return erspart. Denn in der "realen" Klasse soll der Funktion "incvar" eine ganze Liste übergeben werden, die diese dann direkt bearbeiten soll. Da ich nicht wusste ob folgender Konstrukt funktionieren würde:
Code: Alles auswählen
def Methode_der_Klasse_A(self, Liste)
mache_irgendwas_mit_Liste
return Liste
Liste_der_Klasse_B = [[self.testvar1, self.testvar2], [self.testvar3, self.testvar4]]
Liste_der_Klasse_B = Methode_der_Klasse_A(Liste_der_Klasse_B)
Liste_der_Klasse_C = [[self.testvar5, self.testvar6], [self.testvar7, self.testvar8]]
Liste_der_Klasse_C = Methode_der_Klasse_A(Liste_der_Klasse_C)
kam mir der Gedanke, die Variablen einzeln zu übergeben und dann aber direkt von der Basisklasse ohne Return ändern zu lassen. Ich habe unten nochmal versucht, dass deutlicher darzustellen, was ich vorhabe. Allerdings ohne Listen. Da der Test mit den Listen in meinem Originalprogramm ziemlich aufwendig zum Testen ist, hatte ich mir überlegt die einzelnen Variablen zu übergeben und dazu ein kurzes Beispiel zusammengestellt.
Zum Anderen will ich noch eine zweite Klasse ableiten. Darin soll wieder dieselbe Funktion aufgerufen werden, aber mit anderen Variablen bzw. Listen. Daher wäre die von Dir vorgeschlagene Lösung mit incvars nicht geeignet.Ich hoffe an dem Beispiel unten wird es deutlicher.
In beiden Klassen werden dieselbe Variablen der Basisklasse benötigt. Aber teilweise eben für unterschiedliche Berechnungen und Zuweisungen.
Sirius3 hat geschrieben:
Methoden ruft man übrigens mit self.incvars(...) auf und nicht umständlich per A.incvars(self, ...).
Danke, war mir nicht bekannt.
Sirius3 hat geschrieben:vor allem __init__ sollte nie außerhalb von der __init__-Methode der Kindklasse aufgerufen werden.
Das habe ich nicht verstanden. Wenn Du das hier meinst:
Das war ein Fehler bei der Erstellung des Kurzbeispiels. Ich rufe die __init__-Methoden nur in den __init_-Methoden der abgeleiteten Klassen auf. Bevor ich hier den Post aufgemacht hatte, habe ich erst einmal selber probiert, ob ich es nicht hinbekomme. Da kam mir der Gedanke, ob es vielleicht an dem fehlenden __init__ liegen könnte und habe einfach mal probiert. Sorry, war natürlich hier im Beispiel blöd, da ich es mir auf die schnelle zusammengeschrieben hatte. Hätte ich vor dem posten wieder rausnehmen sollen.
Sirius3 hat geschrieben: Supermethoden werden üblicherweise nur von der überschriebenen Methode aufgerufen,
Das habe ich nicht verstanden. Wenn Du das wie im obigen Beispiel meinst, dann stimme ich Dir zu. Mache ich auch nicht anders in der "realen" Klasse. Dort wird nur die eigentliche Methode überschrieben und die Methode der Basisklasse auch von anderen Methoden der abgeleiteten Klasse nicht aufgerufen. Wie bereits geschrieben, war es nur ein Kurzbeispiel, das aus meinen Tests übriggeblieben ist.
Code: Alles auswählen
class A:
def __init__(self):
self.testvar1 = 0
self.testvar2 = 0
self.testvar3 = 0
self.testvar4 = 0
def incvars(self, var1, var2):
var1 += 1
var2 += 1
class B(A):
def myincvars(self):
self.testvar1 = 2
self.testvar2 = 4
self.incvars(self.testvar1, self.testvar2)
class C(A):
def myincvars(self):
self.testvar3 = 6
self.testvar4 = 8
self.incvars(self.testvar3, self.testvar4)
X = A()
X.myincvars()
Y = B()
Y.myincvars()