[Route vers Python intermédiaire] Définir la fonction __getattr__ dans la classe

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, définissons une méthode spéciale __getattr__ dans la classe.

Attributs d'instance

Comme moyen de récupérer les attributs utilisés dans une instance en Python Il existe un moyen de faire référence à «__dict __».

Le nom de l'espace de noms utilisé dans l'instance est défini comme un dictionnaire dans __dict__.

Par exemple, prenez l'exemple suivant.

class A:

    def __init__(self, x, y):
        self.x = x
        self.y = y


# {'x': 10, 'y': 20}
a = A(10, 20)
print(a.__dict__)

L'instance a a les noms $ x, y $ Vous pouvez les récupérer sous forme de dictionnaire.

__getattr__

Vous pouvez définir une méthode spéciale appelée __getattr__ dans une classe Python.

En appelant le nom d'une instance de Python S'il est appelé avec un nom non défini, il retournera ** AttributeError **.

Mais si __getattr__ est défini, Au lieu de renvoyer une AttributeError "lors d'un appel avec un nom non défini", __getattr__ est exécuté.

Regardons un exemple.

class A:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __getattr__(self, name):
        print(name, 'getattr')
        if name == 'hello':
            return self.world
        raise AttributeError

    def world(self, x):
        return x


'''
{'x': 10, 'y': 20}
hello getattr
<bound method A.world of <__main__.A object at 0x10e602150>>
hello getattr
20
'''
a = A(10, 20)
print(a.__dict__)
print(a.hello)
print(a.hello(20))

La méthode __getattr__ est définie dans la classe A ci-dessus.

Lorsque j'essaye d'appeler ʻa.hello, l'attribut hello n'est pas défini dans a. Par conséquent, la méthode getattr` est appelée et renvoie la méthode world à la place.

Dans ʻa.hello (20) `, la méthode world est retournée en premier, et la méthode world reçoit une valeur de 20 et est exécutée. Par conséquent, il est exécuté lorsque le nom bonjour est confirmé.

Par conséquent, si vous utilisez les propriétés ci-dessus, le code inutile suivant sera appliqué.

class A:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __getattr__(self, name):
        print(name, 'getattr')
        if name == 'hello':
            return self.world
        if name == 'world':
            return self.great
        if name == 'great':
            return self.bad
        if name == 'bad':
            return 0
        raise AttributeError


'''
{'x': 10, 'y': 20}
hello getattr
world getattr
great getattr
bad getattr
0
'''
a = A(10, 20)
print(a.__dict__)
print(a.hello)

Exemple d'application

Je ne peux pas penser à de nombreux exemples d'application, S'il n'y a pas d'attribut, je me demande s'il existe un autre traitement des règles. De plus, il semble que la succursale, etc., puisse être modifiée en fonction du nom de l'appel.

class A:

    def __getattr__(self, name):
        self.nothing(name)

    def exist(self):
        print('exist!')

    def nothing(self, name):
        print(f'nothing {name}')


'''
exist!
nothing unnti
'''
a = A()
a.exist()
a.unnti

En outre, chaque contenu en tant qu'article distinct à une date ultérieure Il semble qu'il puisse également être utilisé en lançant un code d'exception lorsqu'il n'y a pas de nom dans l'expression lambda.

Les références

Recommended Posts

[Route vers Python intermédiaire] Définir la fonction __getattr__ dans la classe
[Road to Intermediate Python] Définissez dans votre propre classe
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__
Une route vers Python intermédiaire
[Python] Road to the Serpent (3) Classe Python
[Road to Intermediate] Comprendre les propriétés Python
[Road to Intermediate Python] Installer des packages en masse avec pip
[Route vers Python intermédiaire] Utiliser l'instruction if dans la notation d'inclusion de liste
[Introduction à Python] Comment utiliser la classe en Python?
[Route vers Python intermédiaire] Utiliser des opérateurs ternaires
Comment définir dynamiquement des variables en Python
Comment utiliser __slots__ dans la classe Python
[Route vers Python intermédiaire] Utiliser des expressions lambda
[Route vers Python intermédiaire] Résumé du lien de l'article
Enregistrer automatiquement les arguments de fonction dans argparse en Python
[Road to Intermediate] Python semble être tous des objets
classe de cas en python
Notation de classe en Python
Comment définir Decorator et Decomaker avec une seule fonction
Convertir / renvoyer des objets de classe au format JSON en Python
[Road to Intermediate] Utiliser les variables de fonction intégrées de Python
Covector pour penser en fonction
Créer une fonction en Python
Pour vider stdout en Python
Utiliser la fonction de rappel en Python
Fonction ntile (décile) en python
Connectez-vous au site Web en Python
Modélisation de fonctions non linéaires en Python
Dessiner la fonction Yin en python
Parler avec Python [synthèse vocale]
Fonction immédiate (lie) en python
Comment développer en Python
Publier sur Slack en Python
Comment utiliser la méthode __call__ dans la classe Python
Comment définir plusieurs variables dans une instruction Python for
Comment échantillonner à partir de n'importe quelle fonction de densité de probabilité en Python
Pour renvoyer char * dans une fonction de rappel à l'aide de ctypes en Python
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
[Road to Intermediate Python] Permet des opérations de comparaison pour des classes uniques
[Python] Comment faire PCA avec Python
Implémenter la fonction power.prop.test de R en python
Définition du type d'argument de fonction en python
Notation inclusive dans l'argument de la fonction Python
Les mines terrestres cachées dans les variables de classe Python
Comment collecter des images en Python
[Route vers Python intermédiaire] Spécifiez dynamiquement la méthode d'exécution par nom de variable
[Python 3.8 ~] Comment définir intelligemment des fonctions récursives avec des expressions lambda
Comment utiliser SQLite en Python
Ecrire une fonction AWS Lambda en Python
Lire des morceaux PNG en Python (édition de classe)
Mesurer le temps d'exécution de la fonction en Python
Dans la commande python, python pointe vers python3.8
Essayez de calculer Trace en Python
J'ai écrit une fonction pour charger le script d'extension Git en Python
Road to Intermediate Linux: Network Edition
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Comment utiliser Mysql avec python
Comment envelopper C en Python
Comment utiliser ChemSpider en Python