[Road to Intermediate Python] Permet des opérations de comparaison pour des classes uniques

Lien vers le résumé

https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8

introduction

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.

Calcul de comparaison

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 "<=".

Propre classe

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

N'est pas défini.

Par conséquent, vous pouvez comparer et trier les instances de classe en définissant vous-même ces attributs.

Essayez de mettre en œuvre

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.

Résumé

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 ...

Les références

Recommended Posts

[Road to Intermediate Python] Permet des opérations de comparaison pour des classes uniques
Une route vers Python intermédiaire
[Road to Intermediate] Comprendre les propriétés Python
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__
[Route vers Python intermédiaire] Utiliser des opérateurs ternaires
[Route vers Python intermédiaire] Utiliser des expressions lambda
La route de la compilation vers Python 3 avec Thrift
[Route vers Python intermédiaire] Résumé du lien de l'article
[Road to Intermediate] Python semble être tous des objets
[Route vers Python intermédiaire] Définir la fonction __getattr__ dans la classe
[Road to Intermediate Python] Définissez dans votre propre classe
[Python] Road to the Serpent (5) Jouez avec Matplotlib
Connectez-vous à BigQuery avec Python
Connectez-vous à Wikipedia avec Python
Publiez sur Slack avec Python 3
[Route vers Python intermédiaire] Utiliser l'instruction if dans la notation d'inclusion de liste
Je veux assister automatiquement à des cours en ligne avec Python + Selenium!
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
[Route vers Python intermédiaire] Spécifiez dynamiquement la méthode d'exécution par nom de variable
Python: comment utiliser async avec
Lien pour commencer avec python
[Python] Ecrire dans un fichier csv avec Python
Ravi de vous rencontrer avec python
Essayez d'exploiter Facebook avec Python
Sortie vers un fichier csv avec Python
Convertir la liste en DataFrame avec python
Conversion MP3 → WAV avec Python
[Python] Road to the Serpent (3) Classe Python
Pour faire une récursion avec Python2
Road to Intermediate Linux: Network Edition
Que faire avec la sortie de PYTHON?
Comment calculer la date avec python
Publiez facilement sur Twitter avec Python 3
Je veux déboguer avec Python
Automatisez les opérations du clavier et de la souris avec python pour rationaliser le travail quotidien [RPA]
Essayez de vous connecter à qiita avec Python
Changer l'environnement Python 64 bits en environnement 32 bits avec Anaconda
Reconnaissance vocale en anglais avec python [speech to text]
Convertir un mémo à la fois avec Python 2to3
mail html avec image à envoyer avec python
Mémo pour demander des KPI avec python
python à retenir uniquement avec bonjour, mondes
Sortir les caractères de couleur en joli avec python
Lier des méthodes aux classes et instances Python
Introduction au remplissage d'image Python Remplissage d'image à l'aide d'ImageDataGenerator
Convertir des données Excel en JSON avec python
[Python] Road to snakes (1) Construction de l'environnement
Convertir Hiragana en Romaji avec Python (bêta)
Fractal pour faire et jouer avec Python
Je voulais résoudre ABC160 avec Python
Connectez-vous à MySQL avec Python dans Docker
Comment utiliser BigQuery en Python
Classe Trump en Python (avec comparaison)
[Introduction à Python] Utilisons foreach avec Python
Caméra à pixel unique à expérimenter avec Python
Convertissez des données FX 1 minute en données 5 minutes avec Python