[Python-de] Frage zur Vererbung

Stefan Schwarzer sschwarzer at sschwarzer.net
Do Sep 11 11:09:50 CEST 2014


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



Mehr Informationen über die Mailingliste python-de