https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8
Um Python zu studieren, habe ich eine Group Intelligence Library namens acopy kopiert.
In acopy werden viele interessante Python-Grammatiken und -Sprachen verwendet, und es wird zusammengefasst, dass es unter ihnen nützlich ist.
Dieses Mal können Vergleichsoperationen für die Instanzen der Klasse ausgeführt werden.
Vergleichsoperationen werden für die in Python integrierten Datentypen definiert.
Zum Beispiel kann natürlich die Anzahl der Instanzen der int-Klasse sortiert und verglichen werden.
'''
[-2, -1, 1, 2, 3, 5]
'''
a = [1, 2, 3, 5, -1, -2]
a.sort()
print(a)
Wie oben erwähnt, können Sie sortieren und natürlich Operatoren wie "<=
" verwenden.
Sie können jedoch keine Vergleichsoperationen für Ihre eigene Klasse ausführen. Spezielle Attributmethode erforderlich, um eine Vergleichsoperation durchzuführen
__lt__
less than__le__
less or equal__eq__
equal__ne__
not equal__gt__
greater than__ge__
greater or equalIst nicht definiert.
Daher können Sie Klasseninstanzen vergleichen und sortieren, indem Sie diese Attribute selbst definieren.
import functools
@functools.total_ordering
class A:
def __init__(self, x):
self.x = x
def __repr__(self):
return f"x = {self.x}"
def __eq__(self, other):
return self.x == other.x
def __lt__(self, other):
return self.x < other.x
'''
[x = 2, x = 3, x = 10, x = 20]
'''
arr = [A(10), A(20), A(3), A(2)]
arr.sort()
print(arr)
In Klasse A ist das Attribut "repr" definiert, damit der Ausdruck besser lesbar ist.
Hier werden "eq" und "lt" definiert, die die Vergleichsbeziehung mit anderen Instanzen "other" darstellen.
self.x <other.x
von __lt__
gibt True zurück, wenn es kleiner als der Gegner ist und kein Austausch mehr erforderlich ist! Es ist ein Bild geworden.
Tatsächlich sind in der obigen Klasse nur __eq__
und __lt__
definiert, aber sie funktionieren gut.
Dies liegt daran, dass der total_ordering-Dekorator von functools verwendet werden kann, um auf andere Vergleichsmethoden zu schließen.
Es ist praktisch, Vergleichsoperationen direkt für die Klasse zum Sortieren und natürlich für if-Anweisungen auszuführen. Ich fand es praktisch, vergleichen zu können, indem ich nur "eq" und "lt" definierte. C ++ ist so nervig ...
Recommended Posts