Python >> Tutoriel Python >  >> Python

Méthode magique Python __setattr__()

La méthode magique de Python __setattr__() implémente le setattr() intégré fonction qui prend un objet et un nom d'attribut comme arguments et supprime l'attribut de l'objet.

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 minimal

object.__setattr__(self, attr_name, attr_value)

Examinons un exemple où vous remplacez le __setattr__ méthode magique d'une classe personnalisée Person pour simplement imprimer les arguments plutôt que de vraiment changer les attributs de la classe comme valeur par défaut setattr() fonction ferait :

class Person:
    def __setattr__(self, attr_name, attr_value):
        print(attr_key, attr_value)
    

alice = Person()
setattr(alice, 'age', 32)
# age 32

💡Notez que si vous n'aviez pas remplacé le __setattr__() méthode magique, Python aurait créé un nouvel attribut pour le alice instance, donc lors de l'appel alice.age , vous auriez obtenu la valeur 32 .

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

Setattr d'arrière-plan()

setattr(object, string, value) intégré de Python la fonction prend trois arguments :

  • un objet ,
  • une chaîne , et
  • une valeur arbitraire .

Il définit l'attribut donné par la chaîne sur l'objet à la valeur spécifiée.

Après avoir appelé la fonction, il y a un attribut nouveau ou mis à jour à l'instance donnée, nommé et évalué comme indiqué dans les arguments.

Par exemple, setattr(object, 'attribute', 42) est équivalent à object.attribute = 42 .

Avant de nous plonger dans un autre exemple pratique du setattr() fonction, n'hésitez pas à regarder ma vidéo explicative ici :

Plongeons-nous ensuite dans un exemple.

Dans la programmation orientée objet, vous pouvez souvent voir l'utilisation du setattr() fonction intégrée en combinaison avec l'objet self dans le __init__() méthode d'initialisation.

L'idée est decréer une classe avec des attributs dynamiques choisis au moment de l'exécution par l'utilisateur ou le programme. De cette façon, vous pouvez créer des classes de conteneur qui contiennent des attributs arbitraires.

class Person:
    def __init__(self, attributes):
        for key, value in attributes.items():
            setattr(self, key, value)


# Create two different persons
alice = Person({'name': 'Alice', 'income': 180000, 'eyes': 'blue'})
bob = Person({'firstname': 'Max', 'lastname': 'Power'})


# Different persons, different attributes
print(alice.name + ' ' + str(alice.income) + ' ' + alice.eyes)
print(bob.firstname + ' ' + bob.lastname)


# Output:
'''
Alice 180000 blue
Max Power
'''

C'est un moyen pratique de créer des classes avec différents noms d'attributs.

Références :

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