Seite 1 von 1

Objektorientiert Objekte später erzeugen und verwalten

Verfasst: Freitag 11. November 2011, 19:30
von Sayala
Hallo liebe Python freund,
ich hab mich nach einer längern Programmierpause an ein kleines neues Projekt gesetzt und sitze vor einem Problem. Ich hab mich mit Pygame etwas angefreundet und Snake Programmiert. Jetzt will nun ein eigenes Spiel entwerfen. Zu meinem Problem:
Wenn ich z.b. eine Klasse Auto habe kann ich sie ansteuern indem ich z.b. schreibe

Code: Alles auswählen

class Auto(object):
    def __init__( ... )
        .
        .
        .


Blaues_auto = Auto( ... )
Das Problem dabei ist, dass ich vorher schon wissen muss, wie viele Autos ich haben will um sie alle zu verwalten. Aber ich will die Objekte wärend des spiels beliebig oft erzeugen (ggf. entfernen) und alle müssen ansteuer bar sein. Ansätze von lösungen mit Listen haben bis jetzt leider keine erfolge gezeigt.

Suchmaschiene haben leider bei der anzahl an wörter probleme mir was vernüftiges wiederzugeben und Tutorials zeigen nur die fixierte Methode.

Ich denke ich bin nicht der erste mit diesem Problem und ich hoffe, dass mir jemand mit Erfahrung dabei helfen kann.
Vielen dank schonmal im Voraus.

Re: Objektorientiert Objekte später erzeugen und verwalten

Verfasst: Freitag 11. November 2011, 19:51
von BlackJack
@Sayala: Du müsstest die Autos halt in eine Datenstruktur stecken. Zum Beispiel in eine Liste.

Re: Objektorientiert Objekte später erzeugen und verwalten

Verfasst: Freitag 11. November 2011, 20:03
von Sayala
Vielen dank!

Hab es direkt getestet und es klappt :D
Hier der Beispielcode für eine Lösung:

Code: Alles auswählen

liste = []
class Auto(object):
    def __init__(self,farbe):
        self.farbe = farbe
    
liste.append(Auto("blau"))
liste.append(Auto("rot"))
liste.append(Auto("schwarz"))

for i in range(len(liste)):
    liste[i].farbe = "lila"

for i in range(len(liste)):        #Als Beweis, dass sich die Farben geändert haben
    print liste[i].farbe

Re: Objektorientiert Objekte später erzeugen und verwalten

Verfasst: Freitag 11. November 2011, 20:17
von deets
Bitte nicht mittels range iterieren - das ist unnoetig in Python (meistens jedenfalls)

Es geht viel einfacher mit

Code: Alles auswählen

for auto in liste:
     auto.farbe = "lila"


Re: Objektorientiert Objekte später erzeugen und verwalten

Verfasst: Freitag 11. November 2011, 20:30
von Sayala
@Deets
In diesem Fall wäre es einfacher aber das war auch ein vereinfachtes beispiel. Wenn ich z.b. Punkte habe die sich auf einem koordinaten system bewegen muss ich die geschwindigkeit und die neue Position für jeden Punkt bestimmen. In dem fall würde ich sagen, müsste man die gesamte Liste entlang laufen

Edit:
oder ist dies auch möglich mit:

Code: Alles auswählen

for auto in liste:
     auto.farbe = berechnung_neue_position()
?

Re: Objektorientiert Objekte später erzeugen und verwalten

Verfasst: Freitag 11. November 2011, 20:37
von Sayala
Sayala hat geschrieben:@Deets
In diesem Fall wäre es einfacher aber das war auch ein vereinfachtes beispiel. Wenn ich z.b. Punkte habe die sich auf einem koordinaten system bewegen muss ich die geschwindigkeit und die neue Position für jeden Punkt bestimmen. In dem fall würde ich sagen, müsste man die gesamte Liste entlang laufen

Edit:
oder ist dies auch möglich mit:

Code: Alles auswählen

for auto in liste:
     auto.position = berechnung_neue_position()
?

Re: Objektorientiert Objekte später erzeugen und verwalten

Verfasst: Freitag 11. November 2011, 20:44
von deets
In der Zeit, in der du das Posting geschrieben hast, haettest du das schon ausprobieren koennen.. ;)

Und natuerlich geht das auch so - was ist denn an einer position fundamental anders als an einer Farbe? Beides sind in diesem Fall nur Attribute eines Objektes.

Re: Objektorientiert Objekte später erzeugen und verwalten

Verfasst: Freitag 11. November 2011, 22:25
von Dav1d
Es gibt enumerate, ein kleines Beispiel:

Code: Alles auswählen

In [11]: autos = list()

In [12]: autos.append('bmw')

In [13]: autos.append('ford')

In [14]: autos.append('audi')

In [15]: print(autos)
['bmw', 'ford', 'audi']

In [17]: for index, auto in enumerate(autos):
   ....:     print(index, autos[index], auto)
   ....: 
0 bmw bmw
1 ford ford
2 audi audi