Verfasst: Dienstag 16. Januar 2007, 18:17
Ok, Thx. Dann fülle ich mich diesbezüglich nun sicherer. War mir nie wirklich sicher ob man das so wie bei einem echten ``dict`` behandeln soll.
lg
lg
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Hallo birkenfeld,birkenfeld hat geschrieben:Wenn der OP nach Nachnamen zugreifen will, und normalerweise nur nach Nachnamen, lohnt es sich ein Dictionary zu verwenden, dessen Keys Nachnamen sind, und dann zumindest __getitem__ zu ueberladen, damit man so zugreifen kann:
Code: Alles auswählen
mitarbeiter["Mueller"]
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
Sollte die Klasse "Einer" nicht besser von dict erben, anstatt von object?birkenfeld hat geschrieben:Beispiel:
Wieso?jens hat geschrieben:Sollte die Klasse "Einer" nicht besser von dict erben, anstatt von object?birkenfeld hat geschrieben:Beispiel:
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
Code: Alles auswählen
for mrX in c:
print mrX.name, mrX.tel
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'}
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()