Invalid Syntax an komischer Stelle | Telefonbuchklasse

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BlackJack

Ausser wenn es zwei Leute mit dem gleichen Namen gibt, könnte das funktionieren.

Aber wieso musst Du überhaupt die Namen auf die `Eintrag` Objekte abbilden? Du kannst doch auch gleich die Liste mit den `Eintrag` Objekten durchsuchen.

Einfaches Beispiel, das mit einer Adressenliste in der Telefonbuchklasse auskommt:

Code: Alles auswählen

class Entry(object):
    def __init__(self, name, surname, phone):
        self.name = name
        self.surname = surname
        self.phone = phone
    
    def __str__(self):
        return '%s, %s (%s)' % (self.surname, self.name, self.phone)
    
    def __cmp__(self, other):
        return cmp(self.surname, other.surname) or cmp(self.name, other.name)


class Phonebook(object):
    def __init__(self):
        self.addresses = list()
    
    def __len__(self):
        return len(self.addresses)
    
    def __iter__(self):
        return iter(self.addresses)
    
    def __str__(self):
        return '\n'.join(map(str, self))
    
    def add(self, entry):
        self.add_many([entry])
    
    def add_many(self, entries):
        self.addresses.extend(entries)
        self.addresses.sort()
    
    def search(self, string, fields=('surname',)):
        result = list()
        for entry in self:
            for field in fields:
                if string in getattr(entry, field):
                    result.append(entry)
                    break
        return result

phonebook = Phonebook()
phonebook.add_many((Entry('Klaus', 'Meier', '123-1'),
                    Entry('Hans', 'Meier', '123-2'),
                    Entry('Klaus', 'Schulz', '456'),
                    Entry('Max', 'Mustermann', '983')))

print phonebook
print map(str, phonebook.search('Meier'))
print map(str, phonebook.search('Klaus', ['name']))
print map(str, phonebook.search('123', ['phone']))
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

wenn du mir den code noch kommentieren könntest, wär super :)
Hab da nich alles verstanden.
Für was is z.b. __iter__ oder __cmp__? Noch ne Frage nebenbei: Gibt es auch ein deutsches Manual? Bzw http://docs.python.org auf deutsch?
BlackJack

Die Methoden mit den zwei Unterstrichen vorne und hinten sind dazu da, das man Klassen schreiben kann, die sich ähnlich wie die eingebauten Datentypen verhalten. Meistens haben sie den gleichen Namen wie eingebaute Funktionen, die dann eben diese Methoden aufrufen.

`__str__` wird zum Beispiel aufgerufen wenn man die `str()` Funktion auf ein Objekt anwendet oder das Objekt mit `%s` in einer Zeichenkette formatiert oder mit ``print`` ausgibt.

`__iter__` wird von der `iter()` Funktion aufgerufen und wenn man das Objekt nach dem ``in`` einer ``for``-Schleife platziert. Die Methode muss einen Iterator zurückgeben.

Da ein `Entry` Objekt "weiss" wie es in eine Zeichenkette umgewandelt werden kann und ein `Phonebook` Objekt "iterierbar" ist, also in einer Schleife die enthaltenden `Entry` Objekte zurückgibt, kann man zum Beispiel so etwas schreiben:

Code: Alles auswählen

for entry in phonebook:
    print entry
Die `__cmp__()` Methode wird aufgerufen wenn man die `cmp()` Funktion anwendet und auch bei Vergleichsoperationen wie `==`, `!=`, `>`, `<`, `>=` und `<=`. So kann man eigenen Datentypen eine Ordnung geben. Man kann `Entry` Objekte also miteinander vergleichen. Und weil man das kann, ist es möglich mit der `sort()` Methode auf Listen, eine Liste von Telefonbucheinträgen zu sortieren.
Antworten