Seite 1 von 1

Frage zur Namensgebung (Variable im Namen)

Verfasst: Montag 24. September 2007, 18:24
von m.k.
Guten Tag, ich habe eine Frage wie es in der Überschrift steht und zwar würde ich mir gerne diese Struktur:

Code: Alles auswählen

Haus1=Haus(1)
Haus2=Haus(2)
...
ersparen, indem ich folgende Schleife einsetze:

Code: Alles auswählen

for i in range(100):
     Haus(i+1)
Das Problem hierbei ist, dass die jeweilige Klasse Haus, die ich erstelle nun keiner variablen mehr zugeordnet werden kann, dazu müsste ich

Code: Alles auswählen

nr=str(i+1)
Haus+nr=Haus(i+1)
schreiben, doch das geht nicht :roll:
Gibt es da irgendeine Möglichkeit dieses Problem zu lösen?

Verfasst: Montag 24. September 2007, 18:32
von poker
Hi,

Code: Alles auswählen

from pprint import pprint as pp
class Haus(object):
    def __init__(self, id_):
        self.id_ = id_
    def __repr__(self):
        return "<%s.%s with id %d>" %(
            self.__class__.__module__, 
            self.__class__.__name__, self.id_)

ns = locals()
for idx in xrange(5):
    ns["haus_%d" % idx] = Haus(idx)

pp(ns)
print haus_0
Das ist aber **sehr** schlechter Stil und sollte nicht verwendet werden! Mach dir mal Gedanken über eine richtige Datenstruktur.

EDIT: typos

Verfasst: Montag 24. September 2007, 18:43
von mitsuhiko
ARGH. Für das Schnippsel gehörst du geschlagen Poker!

@Topic: Für sowas gibts Listen und Dictionaries. Schau dir mal ein Python Tutorial an.

Verfasst: Montag 24. September 2007, 18:44
von BlackJack
Vielleicht sollte man das besser nicht verraten weil's so schlechter Stil ist und statt dessen lieber den besseren Stil zeigen.

Code: Alles auswählen

haeuser = [Haus(i) for i in xrange(100)]

# Zugriff mit:
haus = haeuser[0]

Verfasst: Montag 24. September 2007, 18:46
von poker
So hier mal etwas schnel zusammengeackt und viel besser :)

BTW Ungetestet!

Code: Alles auswählen

from pprint import pprint as pp
class Haus(object):
    def __init__(self, id_):
        self.id_ = id_
    def __repr__(self):
        return "<%s.%s with id %d>" %(
            self.__class__.__module__, 
            self.__class__.__name__, self.id_)
        
class Stadt(object):
    def __init__(self):
        self._haeuser = []
    def create(self, id_):
        self._haeuser.append(Haus(id_))
    def get(self, id_):
        self._haeuser[id_]
    def __iter__(self):
        return iter(self._haeuser)
    
s = Stadt()
for idx in xrange(5):
    s.create(idx)

pp(tuple(iter(s)))
In ``Stadt`` kann auch __getitem__, etc überladen werden und dann kannst wie mit einer Liste drauf zugreifen :)
blackbird hat geschrieben:ARGH. Für das Schnippsel gehörst du geschlagen Poker!
:D Ich weiß ;) Hab ja extra auch geschrieben das man das nicht verwenden soll. Aber hey, in Ruby mache ich sowas ähnliches den ganzen Tag *duck* -- Joke.

Verfasst: Montag 24. September 2007, 18:49
von m.k.
Danke BlackJack, das klappt wunderbar :)

Verfasst: Montag 24. September 2007, 21:07
von lunar
BlackJack hat geschrieben:Vielleicht sollte man das besser nicht verraten weil's so schlechter Stil ist und statt dessen lieber den besseren Stil zeigen.
Naja, immer zeigt dieses Beispiel auch ganz nett, was mit Python so alles möglich ist und in anderen Sprache so nicht gehen würde ;)