Maison  >  Article  >  développement back-end  >  Décorateur Getters et Setters en Python

Décorateur Getters et Setters en Python

PHPz
PHPzoriginal
2024-08-06 03:46:531040parcourir

Decorator Getters and Setters in Python

Un type de décorateurs sont les getters et setters de propriété. Ces décorateurs permettent un accès contrôlé aux variables dans les instances de classe.

Les getters et setters de propriétés sont conçus spécifiquement pour le contrôle des attributs dans la programmation orientée objet. Ceux-ci sont différents des décorateurs de fonctions dans la mesure où ils sont utilisés pour les attributs de classe (consultez mon article sur les décorateurs de fonctions ici).

Les décorateurs de fonctions et les décorateurs getter et setter de propriétés modifient le code avec du code réutilisable et utilisent la syntaxe '@'. Ils modifient tous les deux la fonctionnalité du code.

D'accord, allons-y.

Les getters et setters de propriétés sont appliqués aux méthodes au sein d'une classe pour définir divers comportements. Un setter définit l'attribut sur une valeur, et un getter récupère un attribut d'une classe. L'attribut est défini en premier.

Jetons un coup d'œil à un exemple, puis nous le décomposerons :

class Shoe:
    def __init__(self, brand = "Adidas", size = 9):
        self.brand = brand
        self.size = size
        self._condition = "New"

    @property
    def size(self):
        """The size property"""
        return self._size

    @size.setter
    def size(self, size):
        """size must be an integer"""
        if isinstance(size, int):
            self._size = size
        else:
            print("size must be an integer")

    def cobble(self):
        """Repairs the shoe and sets the condition to 'New'."""
        self.condition = "New"
        print("Your shoe is as good as new!")

    @property
    def condition(self):
        """The condition property"""
        return self._condition

    @condition.setter
    def condition(self, condition):
        self._condition = condition

Passons en revue une partie de ce code :

Les traits de soulignement devant certains attributs (état, taille) indiquent au développeur qu'ils sont privés ; ils sont spécifiques à chaque instance de la classe Shoe (chaque chaussure, en minuscule).

Vous remarquerez peut-être que la condition et la taille sont instanciées différemment. self._condition = "New" signifie que chaque instance (ou objet) de la classe shoe est instanciée avec une condition "New". La même chose est faite pour l'attribut size, mais il n'est pas écrit comme self._size = 9 afin de déclencher la validation de la propriété setter, car size doit être un entier (c'est un processus appelé validation). Nous définissons directement la condition de chaque objet chaussure, au lieu de l'exécuter via les méthodes de définition de propriétés et de lecture.

La méthode Cobble n'a pas besoin de décorateur car elle effectue simplement une action, sans obtenir/définir un attribut de chaque objet chaussure.

Faisons une dernière modification à notre code. Par exemple, que se passe-t-il si nous voulons nous assurer que l’attribut size ne peut pas être modifié ultérieurement ? Après tout, une chaussure ne change pas vraiment de taille, n'est-ce pas ?

Nous pouvons utiliser la fonction hasattr() pour effectuer une vérification sur chaque objet chaussure. Possède-t-il un attribut privé de taille, indiqué par la présence de « _size » ? Si tel est le cas, il ne peut pas être modifié. Voici le code implémenté :

 @size.setter
    def size(self, size):
        """size must be an integer and can't be changed once set"""
        if hasattr(self, '_size'):
            raise AttributeError("Can't change size once set")
        if isinstance(size, int):
            self._size = size
        else:
            raise ValueError("size must be an integer")

Les setters et getters de propriétés sont un peu difficiles à comprendre, mais une fois compris, vous coderez Python comme un pro !

Sources :

Matériel scolaire Flatiron

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn