Ermöglichen Sie die Verwendung eines selbst definierten Gleichheitsurteils, nachdem Sie den Mechanismus des Objektgleichheitsurteils in Python kennen
Über den Beurteilungsmechanismus mit obj1 == obj2
und obj1! = Obj2
python : 3.5.1, 2.7.10
class Foo(object):
def __init__(self, name, age):
self.name = name
self.age = age
Wie oben erwähnt, erstellen Sie nach dem Definieren der Foo-Klasse Instanzen von foo1 und foo2 wie unten gezeigt. Wenn derselbe Wert beurteilt wird oder die Existenz der Liste beurteilt wird, wird sie in derselben Instanz wahr, aber sie wird falsch, wenn der Wert der Mitgliedsvariablen gleich ist, die Instanz jedoch unterschiedlich ist.
foo1 = Foo("foo", 24)
foo2 = Foo("foo", 24)
print(foo1 == foo1) # -> True
print(foo1 == foo2) # -> False
print(foo1 in [ foo1 ]) # -> True
print(foo1 in [ foo2 ]) # -> False
print(foo1 != foo1) # -> False
print(foo1 != foo2) #-> True
Wenn Sie eine gleichwertige Beurteilung mit "==" oder "obj in objlist" von Python durchführen,
Die Methode obj .__ eq__
wird aufgerufen
Andererseits wird "obj .__ ne__" für "! =" Gerufen
Wenn Sie jedoch in 3.5.1 (alle 3 Serien?) Obj .__ eq__
definieren, gibt obj .__ ne__
das Gegenteil zurück, sodass Sie nur obj .__ eq__
überschreiben müssen.
Wenn Sie in 2.7.10 nicht auch "ne" definieren, gibt das Ergebnis von "obj .__ ne__" nicht den entgegengesetzten Wert des überschriebenen "obj .__ eq__" zurück.
Wenn Sie das 2. und 3. System vereinheitlichen möchten, wird empfohlen, "ne" zu definieren.
Beachten Sie jedoch, dass Sie im Fall von eq zuerst die Methode isinstance (obj, CLASSNAME) aufrufen müssen, die bestimmt, ob das Vergleichsziel dieselbe Klasse ist. Wenn die Mitgliedsvariablen "Name" und "Alter" gleich sind und als gleich angesehen werden, definieren Sie Folgendes.
class Bar(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, obj):
if isinstance(obj, Bar):
return self.name == obj.name and self.age == obj.age
else:
return False
def __ne__(self, obj):
return not self.__eq__(obj)
Wenn Sie die Bar-Klasse wie oben definieren, erstellen Sie Instanzen von bar1, bar2 und bar3 wie folgt und sehen Sie die Ergebnisse der Gleichheitsbeurteilung usw. wie folgt.
bar1 = Bar("bar", 24)
bar2 = Bar("bar", 24)
bar3 = Bar("foo", 24)
print(bar1 == bar1) # -> True
print(bar1 == bar2) # -> True
print(bar1 == bar3) # -> False
print(bar1 in [ bar1 ]) # -> True
print(bar2 in [ bar1 ]) # -> True
print(bar3 in [ bar1 ]) # -> False
print(bar1 != bar1) # -> False
print (bar1! = bar2) # -> False 2.7.10 ist True, wenn ne nicht definiert ist print(bar1 != bar3) # -> True
Recommended Posts