En Python, le décorateur @property est un outil puissant pour définir des propriétés, offrant un accès pratique aux attributs des objets. Cependant, le fonctionnement du décorateur peut parfois prêter à confusion, en particulier lorsqu'il est utilisé en conjonction avec la fonction intégrée property.
La fonction property() renvoie un objet descripteur spécial. Cet objet fait office d'intermédiaire entre l'instance de la classe et l'attribut accédé. Lorsqu'un objet descripteur est accédé, sa méthode __get__ correspondante est appelée.
Dans le cas du décorateur @property, la méthode __get__ de l'objet descripteur est définie sur la fonction annotée avec le décorateur. Par exemple, dans le code suivant :
class C: def __init__(self): self._x = None @property def x(self): return self._x
Le décorateur @property crée un objet descripteur et attribue la fonction x à sa méthode __get__. Lorsque la propriété x est accédée à partir d'une instance de C, la méthode __get__ est appelée, en passant l'instance et la classe comme arguments.
c = C() c.x # calls c.__get__(instance=c, type=C)
En revanche, la fonction property(), lorsqu'elle est utilisée directement, prend arguments pour une fonction getter, setter et deleter. Ces arguments sont utilisés pour configurer la fonctionnalité de l'objet descripteur. Cependant, lorsqu'il est utilisé comme décorateur, le décorateur @property ne spécifie pas explicitement ces arguments car il crée un objet descripteur avec le comportement défini dans la fonction décorée.
Le code suivant montre comment utiliser la propriété() et le décorateur @property pour créer des propriétés similaires :
class C: def __init__(self): self._x = None # Using property() function x = property(lambda self: self._x, lambda self, value: self._x) # Using @property decorator @property def x(self): return self._x
Dans les deux cas, accéder à la propriété x renverra l'attribut privé _x.
En résumé, le décorateur @property est un raccourci pratique pour créer des objets descripteurs qui permettent un accès facile aux attributs d'instance. Il crée automatiquement un objet descripteur avec une fonction getter définie sur la fonction décorée, ce qui en fait un outil puissant pour gérer les attributs de classe.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!