Wieso?jens hat geschrieben:Sollte die Klasse "Einer" nicht besser von dict erben, anstatt von object?birkenfeld hat geschrieben:Beispiel:
Iteration in Klasse
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Sieht schon gut aus!birkenfeld hat geschrieben:Beispiel:
Code: Alles auswählen
# Vereinfacht! Nimmt alle Keyword-Argumente als Daten an. # Normalerweise würde man das überprüfen class Einer(object): def __init__(self, **kw): self.__dict__.update(kw) class Mehrere(object): def __init__(self): self._m = {} def add(self, m): self._m[m.name] = m def __getitem__(self, name): return self._m.get(name) # etc. c = Mehrere() c.add(Einer(name="Mueller", tel="0800")) c.add(Einer(name="Maier", tel="0801")) print c["Maier"].tel
fehlt noch eine Iteration
Code: Alles auswählen
for mrX in c:
print mrX.name, mrX.tel
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Ein print c["Maier"] sieht so aus, wenn es von object erbt: <__main__.Einer object at 0x00A70CD0>
OK, man könnte noch die __repr__ Methode neu gestalten...
Aber so geht's doch auch:
Ausgabe:
OK, man könnte noch die __repr__ Methode neu gestalten...
Aber so geht's doch auch:
Code: Alles auswählen
class Einer(dict):
def __init__(self, **kw):
dict.__init__(self, kw)
class Mehrere(object):
def __init__(self):
self._m = {}
def add(self, m):
self._m[m["name"]] = m
def __getitem__(self, name):
return self._m.get(name)
# etc.
c = Mehrere()
c.add(Einer(name="Mueller", tel="0800"))
c.add(Einer(name="Maier", tel="0801"))
print c["Maier"]["tel"]
print c["Maier"]["name"]
print c["Maier"]
Ich muß zugeben, das ich eigentlich lieber mit dicts hantiere, als objecte mit Attributen0801
Maier
{'tel': '0801', 'name': 'Maier'}
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
So:capsule5 hat geschrieben: Sieht schon gut aus!
fehlt noch eine IterationWie muss ich die Klasse erweitern?Code: Alles auswählen
for mrX in c: print mrX.name, mrX.tel
Code: Alles auswählen
class Mehrere(...):
def __iter__(self):
return self._m.itervalues()
SUPER, DANKE!birkenfeld hat geschrieben: So:Und dann solltest du dir natürlich noch überlegen, was BlackJack gesagt hat, dass es nämlich Probleme gibt, sobald zwei Angestellte den gleichen Nachnamen haben.Code: Alles auswählen
class Mehrere(...): def __iter__(self): return self._m.itervalues()
Es ist schon klar, dass der Nachname i. A. kein eindeutiges Kriterium ist. Hier ist das jedoch kein Problem.
Nochmals Dank an alle für die Lösungsvorschläge!