Hallo, ich mache meine ersten Versuche mit der objektorientierten Programmierung. Folgendes Script reagiert für mich (noch) unverständlich. c1 und c2 greifen offenbar auf dieselben Variableninhalte zu, c hat anderer Variableninhalte von l1 und l2. Wie ist das zu verstehen? Mein Ziel wäre, dass c, c1, c2 auf dieselben Inhalte zugreifen können. Danke für eure Hinweise Joachim #!/usr/bin/python # -*- coding: utf-8 -* class C(object): l1=[];l2=[] def __init__(self,v1,v2): self.l1=v1 self.l2=v2 self.c1=C1() self.l1.append('a') self.l2.append('b') self.c2=C2() print('c: l1:',self.l1,'l2:',self.l2) class C1(C): def __init__(self): self.l1.append(3) self.l2.append(4) class C2(C): def __init__(self): print('c2: l1:',self.l1,'l2:',self.l2) if __name__ == '__main__': c=C([1],[2]) print('main,l1:',c.l1,'l2:',c.l2) print('main,c1,l1:',c.c1.l1,'l2:',c.c1.l2) print('main,c2,l1:',c.c2.l1,'l2:',c.c2.l2)
Hallo Joachim, On 2014-09-11 10:13, WehlackJ wrote:
ich mache meine ersten Versuche mit der objektorientierten Programmierung. Folgendes Script reagiert für mich (noch) unverständlich. c1 und c2 greifen offenbar auf dieselben Variableninhalte zu, c hat anderer Variableninhalte von l1 und l2. Wie ist das zu verstehen?
Mein Ziel wäre, dass c, c1, c2 auf dieselben Inhalte zugreifen können. [...]
#!/usr/bin/python # -*- coding: utf-8 -*
class C(object): l1=[];l2=[] def __init__(self,v1,v2): self.l1=v1 self.l2=v2
Ich denke, das hier ist dein Problem. Nach diesen beiden Zuweisungen "sieht" das hier instanziierte Objekt nur noch die an `self.l1` und `self.l2` gebundenen Listen (also `v1` und `v2`). Was du vielleicht eher wolltest, ist self.l1.extend(v1) self.l2.extend(v2) Das ändert die Listen `l1` und `l2` "in-place", was wahrscheinlich das ist, was du wolltest. Da dann im Gegensatz zu deinem Code keine Attribute `l1` und `l2` für die Instanz angelegt werden, gibt dir `C_object.l1` das Klassen-Attribut, für `l2` entsprechend.
self.c1=C1() self.l1.append('a') self.l2.append('b')
Das hier hängt "a" an `v1` und "b" an `v2` an.
self.c2=C2() print('c: l1:',self.l1,'l2:',self.l2)
Du kannst ja mal mit dem `is`-Operator experimentieren:
v1 = [1, 2, 3] v2 = [4, 5, 6] c = C(v1, v2) c.l1 is v1 ? c.l1 is C.l1 ?
Viele Grüße Stefan
WehlackJ wrote:
Hallo, ich mache meine ersten Versuche mit der objektorientierten Programmierung. Folgendes Script reagiert für mich (noch) unverständlich. c1 und c2 greifen offenbar auf dieselben Variableninhalte zu, c hat anderer Variableninhalte von l1 und l2. Wie ist das zu verstehen?
Mein Ziel wäre, dass c, c1, c2 auf dieselben Inhalte zugreifen können.
Danke für eure Hinweise Joachim
#!/usr/bin/python # -*- coding: utf-8 -*
class C(object): l1=[];l2=[]
Die Attribute l1 und l2 haben hier nichts verloren, wenn sie nicht von allen Instanzen von C und den davon abgeleiteten C1 und C2 geteilt werden sollen.
def __init__(self,v1,v2):
Stattdessen gehören sie in den Initialisierer, was du zusätlich tust:
self.l1=v1 self.l2=v2
Damit "versteckst" du die gleichnamigen Klassenattribute in allen Instanzen von C und solchen Subclasses, die C.__init__() aufrufen.
self.c1=C1()
self.l1.append('a') self.l2.append('b') self.c2=C2() print('c: l1:',self.l1,'l2:',self.l2)
class C1(C): def __init__(self):
Normalerweise ruft man hier die __init__-Methode der Basisklasse auf, z. B. mit C.__init__(self, [], []) oder super(C, self).__init__([], []) Das führt natürlich (unter anderem) dazu, dass l1 und l2 'a' und 'b' enthalten, also l1 == ["a", 3] l2 == ["b", 4] Wenn du dass nicht möchtest, musst du C.__init__() entsprechend umgestalten, z. B. indem du die `append`s in eine eigene Methode auslagerst.
self.l1.append(3) self.l2.append(4)
Theoretisch könntest du auch in C1 alle nötigen Initialisierungen vornehmen, # Nicht empfohlen class C1(C): def __init__(self): self.l1 = [3] self.l2 = [4] self.c2 = 42 aber dann zieht jede Änderung an C eine entsprechende Änderung an C1 nach sich und es ist eher sinnlos, C1 überhaupt von C abzuleiten.
class C2(C): def __init__(self): print('c2: l1:',self.l1,'l2:',self.l2)
if __name__ == '__main__': c=C([1],[2]) print('main,l1:',c.l1,'l2:',c.l2) print('main,c1,l1:',c.c1.l1,'l2:',c.c1.l2) print('main,c2,l1:',c.c2.l1,'l2:',c.c2.l2)
Danke an alle für die Hinweise, ich werde das nun erst mal ein wenig testen. Gruß Joachim
Hallo, die Übernahme der Aufrufparameter war falsch. On 11.09.2014 10:13, WehlackJ wrote:
class C(object): l1=[];l2=[] def __init__(self,v1,v2): self.l1=v1 self.l2=v2
Es funktioniert wie gewünscht mit: class C(object): l1=[];l2=[] def __init__(self,v1,v2): self.l1.extend(v1) self.l2.extend(v2) Danke und Gruß Joachim
WehlackJ wrote:
die Übernahme der Aufrufparameter war falsch.
On 11.09.2014 10:13, WehlackJ wrote:
class C(object): l1=[];l2=[] def __init__(self,v1,v2): self.l1=v1 self.l2=v2
Es funktioniert wie gewünscht mit: class C(object): l1=[];l2=[] def __init__(self,v1,v2): self.l1.extend(v1) self.l2.extend(v2)
Und vorher:
Mein Ziel wäre, dass c, c1, c2 auf dieselben Inhalte zugreifen können.
Argh, da hab ich ja komplett in die falsche Richtung "geholfen". Sorry.
participants (3)
-
Peter Otten
-
Stefan Schwarzer
-
WehlackJ