Vererbung [Python]

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
flooojava
User
Beiträge: 13
Registriert: Dienstag 27. Oktober 2015, 22:48

Servus,

ich erbe derzeit von einer Vaterklasse, welche folgendermaßen aufgebaut ist:

Code: Alles auswählen

class Player(pygame.sprite.Sprite):
    sprites_left = []


 def __init__(self,bild):
        pygame.sprite.Sprite.__init__(self)
        self.sprites_left.append(bild)



class A(Player,pygame.sprite.Sprite):
 def __init__(self,bild1):
       Player.__init__(self,bild1))
 def output(self):
       #obligatorische Ausgabe:
       print(self.sprites_left[0])

class B(Player,pygame.sprite.Sprite):
 def __init__(self,bild2):
       Player.__init__(self,bild2))
  def output(self):
       #obligatorische Ausgabe:
       print(self.sprites_left[0])
       
a = A()
b = B()
a.output()
b.output()

Das ganze ist natürlich rein obligatorisch geschrieben, aber das Problem sollte ersichtlich sein.

Weshalb überschreibt b = B() denn das Bild von A? Hat das hier bei Sprites etwas mit Referenzen zu tun? Wieso ist dies nicht komplett unabhängig voneinander? Ich erbe jeweils von beiden Klassen (A,B) von meiner Hauptklasse Player und würde gerne die Sprites in der Hautpklasse erstellen, sodass ich keinen doppelten Code in class A und class B habe, jedoch überschreibt die letzte Initialisierung (hier b=B() ) die vorangegangene Initialisierung a=A()) - Weshalb aber?

Lg
Zuletzt geändert von Anonymous am Samstag 16. Januar 2016, 01:00, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@flooojava: Da wird nichts überschrieben. Beide Aufrufe hängen ihr Bild an die *selbe* Liste. Und von der gibst Du dann zweimal das erste Element aus. Wenn Du etwas pro Exemplar haben willst, darfst Du halt keine Klassenattribute verwenden sondern musst auch für jedes Exemplar eine neue Liste erstellen:

Code: Alles auswählen

class Player(pygame.sprite.Sprite):

    def __init__(self, image):
        pygame.sprite.Sprite.__init__(self)
        self.sprites_left = [image]
Antworten