Python >> Tutoriel Python >  >> Python

Méthode magique Python __set_name__()

La méthode magique de Python obj.__set_name__(self, owner, name) la méthode est créée sur un attribut obj quand la classe owner contenant l'attribut est créé.

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.__set_name__(self, owner, name)

Voici un exemple minimal :

class Attribute: 
    pass

class My_Class:
    x = Attribute()  # Python calls: x.__set_name__(My_Class, 'x')

L'expression x = Attribute() en interne, Python appelle x.__set_name__(My_Class, 'x') .

Exemple de remplacement de __set_name__()

Remplaçons le __set_name__ méthode magique sur le Attribute la classe :

class Attribute: 
    def __set_name__(self, owner, name):
        print('Python is great!')

class My_Class:
    x = Attribute()

En fait, la méthode magique est appelée, ce qui donne le résultat :

Python is great!

Exemple plus pratique

Le but de la méthode magique __set_name__() , cependant, ne consiste pas à imprimer des chaînes factices dans le shell Python, comme vous l'avez peut-être déjà deviné.

💡 Remarque :Le __set_name__() la méthode est appelée automatiquement par Python pour chaque attribut unique détenu par l'objet de classe propriétaire lors de l'initialisation d'un objet - dans notre exemple précédent, un objet de type My_Class . Plus de détails ici.

Cependant, le __set_name__() la méthode n'est pas appelée lors de l'attribution dynamique d'attributs à un objet, plus tard dans le code.

Pour comprendre ce que je veux dire, jetez un œil à cet extrait de code :

class Attribute: 
    def __set_name__(self, owner, name):
        print('Python is great!')

class My_Class:
    pass


My_Class.x = Attribute()   # x.__set_name__() is NOT called!!
# <No Output>

Maintenant, vous pouvez appeler manuellement le __set_name__() méthode pour exécuter la même routine que vous auriez exécutée si vous aviez initialisé l'attribut dans la définition de classe tout de suite :

class Attribute: 
    def __set_name__(self, owner, name):
        print('Python is great!')

class My_Class:
    pass


My_Class.x = Attribute()
# <No Output>

My_Class.x.__set_name__(My_Class, 'x')
# Python is great!

Références :

  • https://docs.python.org/3/reference/datamodel.html