Seite 1 von 2

Verfasst: Dienstag 16. Januar 2007, 18:17
von sape
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

Verfasst: Mittwoch 17. Januar 2007, 09:37
von capsule5
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"]
Hallo birkenfeld,
wie muss ich __getitem__ anpassen, um etwa über "mitarbeiter["Mueller"].tel" den Eintrag verwenden zu können?

Verfasst: Mittwoch 17. Januar 2007, 10:17
von birkenfeld
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

Verfasst: Mittwoch 17. Januar 2007, 10:52
von jens
birkenfeld hat geschrieben:Beispiel:
Sollte die Klasse "Einer" nicht besser von dict erben, anstatt von object?

Verfasst: Mittwoch 17. Januar 2007, 11:14
von BlackJack
Ich würd' gerne Anmerken, dass Nachnamen kein eindeutiger Schlüssel sind.

Verfasst: Mittwoch 17. Januar 2007, 11:24
von birkenfeld
jens hat geschrieben:
birkenfeld hat geschrieben:Beispiel:
Sollte die Klasse "Einer" nicht besser von dict erben, anstatt von object?
Wieso?

Verfasst: Mittwoch 17. Januar 2007, 11:30
von capsule5
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
Sieht schon gut aus!
fehlt noch eine Iteration

Code: Alles auswählen

for mrX in c:
    print mrX.name, mrX.tel
:?: Wie muss ich die Klasse erweitern?

Verfasst: Mittwoch 17. Januar 2007, 11:30
von jens
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:

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"]
Ausgabe:
0801
Maier
{'tel': '0801', 'name': 'Maier'}
Ich muß zugeben, das ich eigentlich lieber mit dicts hantiere, als objecte mit Attributen ;)

Verfasst: Mittwoch 17. Januar 2007, 11:38
von birkenfeld
capsule5 hat geschrieben: Sieht schon gut aus!
fehlt noch eine Iteration

Code: Alles auswählen

for mrX in c:
    print mrX.name, mrX.tel
:?: Wie muss ich die Klasse erweitern?
So:

Code: Alles auswählen

class Mehrere(...):
    def __iter__(self):
        return self._m.itervalues()
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.

Verfasst: Mittwoch 17. Januar 2007, 12:23
von capsule5
birkenfeld hat geschrieben: So:

Code: Alles auswählen

class Mehrere(...):
    def __iter__(self):
        return self._m.itervalues()
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.
SUPER, DANKE!
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!