[PYTHON] __Getattr__ et __getattribute__ pour personnaliser l'acquisition des attributs d'objet par des points

Obtenir des attributs avec .

Je pense que les attributs des objets tels que les variables et les méthodes définies dans l'instruction class sont généralement acquis par .. Par exemple, supposons que vous définissiez la classe suivante.

python


class Foo:
    def __init__(self):
        self.foo = "foo"
        self.bar = "bar"

Les attributs «foo» et «bar» de l'instance «foo» de «Foo» peuvent être obtenus avec «.».

python


>>> foo = Foo()
>>> foo.foo
'foo'
>>> foo.bar
'bar'

Ce comportement . peut être personnalisé en utilisant les méthodes d'attributs spéciaux __getattr__ et __getattribute__.

Personnalisation avec __getattr__

Si vous définissez __getattr__, lorsque vous essayez d'obtenir un attribut dans ., la recherche de nom normale est effectuée en premier, et si l'attribut spécifié n'est toujours pas trouvé, __getattr__ est appelé et la valeur renvoyée est utilisée. Renvoie comme cet attribut.

La classe suivante Foo définit __getattr__ pour toujours renvoyer la variable membre foo.

python


class Foo:

    def __init__(self):
        self.foo = "foo"
        self.bar = "bar"
    
    def __getattr__(self, name):
        return self.foo

L'instance «foo» de «Foo» a une variable membre appelée «self.bar», donc «foo.bar» renvoie «self.bar», mais il n'y a pas de variable membre appelée «self.anything». Donc self .__ getattr__ (" n'importe quoi ") est exécuté et self.foo (c'est-à-dire la chaîne" foo ") est renvoyée.

python


>>> foo = Foo()
>>> foo.foo
'foo'
>>> foo.bar
'bar'
>>> foo.anything
'foo'

Personnalisation avec __getattribute__

Si __getattribute__ est défini, cette méthode sera appelée chaque fois que vous essayez d'obtenir un attribut dans .. Dans la définition de __getattribute__, si vous essayez d'obtenir l'attribut de cet objet en utilisant ., votre propre __getattribute__ sera appelé récursivement, donc pour éviter cela, la superclasse ʻobject Utilisez __getattribute__ de`.

python


class Bar:

    def __init__(self):
        self.foo = "foo"
        self.bar = "bar"
    
    def __getattribute__(self, name):
        return object.__getattribute__(self, "foo")

Comme vous pouvez le voir à partir du résultat de l'exécution suivant, la bar instance bar a une variable membre appelée self.bar, mais même si c'est bar.bar, c'est __getattribute__. self.foo` (c'est-à-dire la chaîne "" foo ") est renvoyée.

python


>>> bar = Bar()
>>> bar.foo
'foo'
>>> bar.bar
'foo'
>>> bar.anything
'foo'

Fonctions intégrées getattr et hasattr

Les fonctions intégrées getattr et hasattr sont basées sur l'acquisition d'attributs personnalisés avec __getattr__ et __hasattr__. Donc, obtenir les attributs d'un objet avec getattr équivaut à l'obtenir avec .. Si vous vérifiez avec les instances Foo et Bar dans l'exemple ci-dessus, la sortie ressemblera à ceci.

python


>>> getattr(foo, "bar")
'bar'
>>> getattr(bar, "bar")
'foo'

Si __getattr__ ou __getattribute__ renvoie une valeur quel que soit l'attribut que vous spécifiez (c'est-à-dire que ʻAttribute Error ne se produit pas), hasattrrenvoie toujoursTrue`.

python


>>> hasattr(foo, "anything")
True
>>> hasattr(bar, "anything")
True

Recommended Posts

__Getattr__ et __getattribute__ pour personnaliser l'acquisition des attributs d'objet par des points
Comment tester les attributs ajoutés par add_request_method de pyramid
Remarque Python: lorsque vous souhaitez connaître les attributs d'un objet
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
Je souhaite personnaliser l'apparence de zabbix
[Blender] Comment obtenir l'ordre de sélection des sommets, des côtés et des faces d'un objet
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
[Python] Modifier le contrôle du cache des objets téléchargés sur Cloud Storage
Comment augmenter la vitesse de traitement de l'acquisition de la position des sommets
Application de la conversion affine par tenseur - de la détection de base à la détection d'objet -
Une introduction à l'orientation des objets - changeons l'état interne d'un objet
Accrocher à la première importation du module et imprimer le chemin du module
Attacher au processus Python de la destination SSH et déboguer
Je veux connaître la nature de Python et pip
Commandes et fichiers pour vérifier la version de CentOS Linux
Comment obtenir la valeur en pixels du point à partir de l'image satellite en spécifiant la latitude et la longitude
Comment obtenir et définir le nom du serveur NTP par DHCP
Comment connaître la structure interne d'un objet en Python
Acquisition automatique des données de niveau d'expression génique par python et R
[EC2] Comment installer Chrome et le contenu de chaque commande
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
[Python] Comment obtenir le premier et le dernier jour du mois
J'ai résumé comment changer les paramètres de démarrage de GRUB et GRUB2
Pour améliorer la réutilisabilité et la maintenabilité des flux de travail créés avec Luigi
Convertissez le résultat de python optparse en dict et utilisez-le
Essayer d'implémenter et de comprendre les arborescences de segments étape par étape (python)
Essayez de prédire le triplet de la course de bateaux en classant l'apprentissage
Je veux faire revivre la légendaire combinaison Nintendo en utilisant pleinement l'IA et la technologie RH!