https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8
Afin d'étudier Python, j'ai copié une bibliothèque d'intelligence de groupe appelée acopy.
Dans acopy, de nombreuses grammaires et idiomes Python intéressants sont utilisés, et il est résumé que c'est utile parmi eux.
Cette fois, nous allons permettre d'effectuer des opérations de comparaison sur les instances de la classe.
Les opérations de comparaison sont définies pour les types de données intégrés de Python.
Par exemple, bien sûr, les nombres d'instances de classe int peuvent être triés et comparés.
'''
[-2, -1, 1, 2, 3, 5]
'''
a = [1, 2, 3, 5, -1, -2]
a.sort()
print(a)
Comme mentionné ci-dessus, vous pouvez trier, et bien sûr vous pouvez utiliser des opérateurs tels que "<=
".
Cependant, vous ne pouvez pas effectuer d'opérations de comparaison sur votre propre classe. Méthode d'attribut spéciale requise pour effectuer l'opération de comparaison
__lt__
less than__le__
less or equal__eq__
equal__ne__
not equal__gt__
greater than__ge__
greater or equalN'est pas défini.
Par conséquent, vous pouvez comparer et trier les instances de classe en définissant vous-même ces attributs.
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)
La classe A a l'attribut __repr__
défini pour rendre l'impression plus facile à lire.
Ici, «eq» et «lt» sont définis, qui représentent la relation de comparaison avec d'autres instances «autres».
self.x <other.x
of __lt__
renvoie True s'il est plus petit que l'adversaire, et il n'est plus nécessaire d'échanger! C'est devenu une image.
En fait, seuls «eq» et «lt» sont définis dans la classe ci-dessus, mais ils fonctionnent bien. C'est parce que le décorateur total_ordering de functools peut être utilisé pour déduire d'autres méthodes de comparaison.
Il est pratique d'effectuer des opérations de comparaison directement sur la classe pour le tri et, bien sûr, les instructions if. J'ai trouvé pratique de pouvoir comparer en définissant uniquement «eq» et «lt». C ++ est tellement ennuyeux ...