Seite 2 von 2

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!