[gelöst] objekte vergleichen

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
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Gibt es eine Möglichkeit Objekte zu vergleichen?

Folgender Code

Code: Alles auswählen

class BifObject(object):
    def __init__(self,entry,cavity,iface,molecule):
        self.entry = entry
        self.cavity = cavity
        self.iface = iface
        self.molecule = molecule
    
    def __repr__(self):
        return "%s,%s,%s,%s" % (self.entry,self.cavity,self.iface,self.molecule)

Und da erstelle ich dann Objekte wie

Code: Alles auswählen

test1 = BifObject(1,1,152,0)
test2 = BifObject(2,9,160,0)
test3 = BifObject(2,9,160,0)
Jetzt will ich irgendwie die Objekte vergleichen...
ein einfacher vergleich bringt mir immer false... ich nehme an weil er die adressen im speicher vergleicht.
Dachte wenn ich die __repr__ methode überschreibe macht er eventuell einen string vergleich oder so, aber das geht auch nicht

hat da jemand ne idee, oder geht das nicht?


EDIT:
ok, hab eben gemerkt das ich mit

Code: Alles auswählen

str(test2) == str(test3)
Die Strings vergleichen kann. Ist das eine brauchbare Lösung? Oder sollte man da anders vorgehen?
Zuletzt geändert von würmchen am Donnerstag 14. Februar 2008, 13:31, insgesamt 1-mal geändert.
BlackJack

Zum Vergleichen kannst Du die `__cmp__()`-Methode implementieren. Wenn die Objekte "immutable" sind, was die Werte angeht, die zum Vergleich herangezogen werden und als Schlüssel in Dictionaries dienen sollen, musst Du noch die `__hash__()`-Methode entsprechend überschreiben.

Die `repr()`-Form ist per Konvention entweder eine Zeichenkette, die man per `eval()` wieder in ein Objekt umwandeln kann, oder ist in spitze "Klammern" (<>) eingefasst.

Code: Alles auswählen

class BifObject(object):
    def __init__(self, entry, cavity, iface, molecule):
        self.entry = entry
        self.cavity = cavity
        self.iface = iface
        self.molecule = molecule
    
    def __repr__(self):
        return '<%s %s,%s,%s,%s>' % (self.__class__.__name__,
                                     self.entry,
                                     self.cavity,
                                     self.iface,
                                     self.molecule)
    
    def __cmp__(self, other):
        return cmp((self.entry, self.cavity, self.iface, self.molecule),
                   (other.entry, other.cavity, other.iface, other.molecule))
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Ok, das hilf mir weiter, nur wunder ich mich, das er den string nicht schreibt wie ich es mir eigentlich denke...

als ergebnis bekomm ich sowas...
<__main__.Atom object at 0xb7cc3f6c>
hätte erwartet das auch die übergebenen werte angezeigt werden


EDIT:
geht doch, diese live Sitzung von Python hat das wohl falsch interpretiert...
Antworten