Seite 1 von 1

[gelöst] objekte vergleichen

Verfasst: Donnerstag 14. Februar 2008, 10:28
von würmchen
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?

Verfasst: Donnerstag 14. Februar 2008, 10:50
von 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))

Verfasst: Donnerstag 14. Februar 2008, 13:23
von würmchen
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...