Python >> Tutoriel Python >  >> Python

Méthode magique Python __getattr__()

La méthode magique de Python __getattr__() implémente le getattr() intégré fonction qui renvoie la valeur associée à un nom d'attribut donné. De plus, __getattr__() est appelé si l'accès normal à l'attribut (par exemple, my_object.my_attribute ) donne un AttributeError .

Nous appelons cela une "méthode Dunder" pour "D ouble Sous Méthode de score" (également appelée "méthode magique" ). Pour obtenir une liste de toutes les méthodes de dunder avec des explications, consultez notre article sur la feuille de triche de dunder sur ce blog.

Syntaxe et exemple

object.__getattr__(self, attr_name)

Examinons un exemple où vous remplacez le __getattr__ méthode magique d'une classe personnalisée Person pour imprimer simplement la chaîne 'hello world' lors de l'appel du getattr() fonction intégrée.

class Person:
    def __getattr__(self, attr_name):
        print('hello world')
    

alice = Person()
getattr(alice, 'age')
# hello world

Notez que __getattr__() est également appelé si vous essayez d'accéder à un attribut qui n'existe pas et qui, par conséquent, produirait un AttributeError sinon.

class Person:
    def __getattr__(self, attr_name):
        print('hello world')
    

alice = Person()
alice.age          # attribute doesn't exist!
# hello world

Voici ce qui se serait passé dans le même scénario sans définir le __getattr__() méthode magique :

class Person:
    pass
    

alice = Person()
alice.age          # attribute doesn't exist!

Comme le alice.age l'attribut n'existe pas, Python lève un AttributeError :

Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 6, in <module>
    alice.age          # attribute doesn't exist!
AttributeError: 'Person' object has no attribute 'age'

Vous pouvez voir ce scénario ensuite dans notre récapitulatif sur le setattr() intégré fonction.

Getattr() en arrière-plan

getattr(object, string) intégré de Python la fonction renvoie la valeur du object 's attribut avec le nom string .

S'il n'existe pas, il renvoie la valeur fournie sous la forme d'un troisième default facultatif dispute.

Si cela n'existe pas non plus, il lève un AttributeError .

Un exemple est getattr(porsche, 'speed') qui équivaut à porsche.speed .

# Define class with one attribute
class Car:
    def __init__(self, brand, speed):
        self.brand = brand
        self.speed = speed


# Create object
porsche = Car('porsche', 100)
tesla = Car('tesla', 110)

# Two alternatives to get instance attributes:
print(getattr(porsche, 'brand') + " " + str(getattr(porsche, 'speed')))
print(tesla.brand + " " + str(tesla.speed))


# Get an attribute that doesn't exist with default argument:
print(getattr(porsche, 'color', 'red'))

Sortie :

porsche 100
tesla 110
red

Autres lectures :

  • Python __delattr__() méthode magique
  • Python setattr() fonction intégrée
  • Python getattr() fonction intégrée
  • Python __getattr__() contre __getattribute__()
  • https://docs.python.org/3/reference/datamodel.html