Ich habe eine Python-Klasse A und seine Kind B. Ich mache ein Objekt der Klasse B übergeben einige Listen-Argumente, die in B angehängt sind und das Ergebnis in Klasse A. Ich würde gerne eines dieser Argumente ändern und sehen, dass sich die Änderung ohne weiteres widerspiegelt. Lassen Sie mich mit einem Beispiel erklären:Python verwenden Lazy-Zuweisung beim Übergeben von Listen an Methoden
class A():
def __init__(self,data):
self.a=data
class B(A):
def __init__(self,x,y):
self.x=x
self.y=y
A.__init__(self,self.x+self.y)
def change_x(self,x):
self.x = x
Jetzt, wen ich laufe
test = B([1, 2], [3,4])
print(test.a)
ich offensichtlich [1,2,3,4]. Wenn ich Teil der Liste wie folgt ändern:
test.change_x([3,4])
print(test.a)
Ich würde [3,4,3,4] bekommen, anstatt natürlich erhalte ich [1,2,3,4]. Natürlich wird test.a nur während der Instanziierung ausgewertet.
Ich verstehe, warum das nicht der Fall ist, und ich lese über Generatoren, aber es gelingt mir nicht herauszufinden, wie dies zu implementieren ist. Ich möchte nicht mit einem iterablen Ergebnis enden, das ich nur einmal durchlaufen kann.
Konnte mir jemand helfen? Ein sauberer Weg, um das zu lösen?
ich natürlich so etwas wie versuchen könnte: def change_x (self, x): Selbst .__ init __ (x, self.y) Aber ich bin mir nicht sicher, ob das ein guter Ansatz ist? – chrisvp
Sie könnten 'a' eine Eigenschaft machen und sie in Klasse' B' überschreiben. – BlackBear
Es gibt nicht wirklich eine Möglichkeit, das mit Ihrem aktuellen Design zu tun. In Ihrem Beispiel, warum ist "A" überhaupt eine Klasse (und warum ist es eine Superklasse von B)? Was Sie tun könnten, ist, B eine Methode zu geben, die das Äquivalent von "self.a.data" macht, aber das Ergebnis dynamisch berechnet. Wenn Sie "a" erstellen, erstellen Sie es mit einigen Daten und "a" weiß nicht, woher diese Daten stammen. Wenn Sie aktualisierte Daten erhalten möchten, ist es möglicherweise einfacher, dies in B zu tun und nicht "a" zu verwenden. – BrenBarn