Recherche…


Syntaxe

  • x.title # Accesses the title attribute using the dot notation
  • x.title = "Hello World" # Sets the property of the title attribute using the dot notation
  • @property # Used as a decorator before the getter method for properties
  • @title.setter # Used as a decorator before the setter method for properties

Accès aux attributs de base à l'aide de la notation par points

Prenons un exemple de classe.

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

book1 = Book(title="Right Ho, Jeeves", author="P.G. Wodehouse")

En Python, vous pouvez accéder au titre de l'attribut de la classe en utilisant la notation par points.

>>> book1.title 
'P.G. Wodehouse'

Si un attribut n'existe pas, Python génère une erreur:

>>> book1.series
Traceback  (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Book' object has no attribute 'series'

Setters, Getters & Properties

Pour des raisons d'encapsulation de données, vous voulez parfois avoir un attribut dont la valeur provient d'autres attributs ou, en général, quelle valeur doit être calculée pour le moment. La méthode standard pour gérer cette situation consiste à créer une méthode, appelée getter ou un setter.

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

Dans l'exemple ci-dessus, il est facile de voir ce qui se passe si nous créons un nouveau livre contenant un titre et un auteur. Si tous les livres à ajouter à notre bibliothèque ont des auteurs et des titres, nous pouvons ignorer les règles et les règles et utiliser la notation par points. Cependant, supposons que nous ayons des livres qui n’ont pas d’auteur et que nous voulons définir l’auteur sur "Unknown". Ou s'ils ont plusieurs auteurs et nous prévoyons de retourner une liste d'auteurs.

Dans ce cas, nous pouvons créer un getter et un setter pour l'attribut author .

class P:
    def __init__(self,title,author):
        self.title = title
        self.setAuthor(author)

    def get_author(self):
        return self.author

    def set_author(self, author):
        if not author: 
            self.author = "Unknown"
        else:
            self.author = author

Ce schéma n'est pas recommandé.

Une des raisons est qu'il y a un piège: Supposons que nous ayons conçu notre classe avec l'attribut public et aucune méthode. Les gens l'ont déjà beaucoup utilisé et ils ont écrit un code comme celui-ci:

>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = ""  #Cos Some Guy didn't write this one!

Maintenant, nous avons un problème. Parce que l' auteur n'est pas un attribut! Python offre une solution à ce problème appelé propriétés. Une méthode pour obtenir les propriétés est décorée avec la propriété @ avant son en-tête. La méthode que nous voulons utiliser en tant que setter est décorée avec @ attributeName.setter avant elle.

Gardant cela à l'esprit, nous avons maintenant notre nouvelle classe mise à jour.

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    @property
    def author(self):
        return self.__author

    @author.setter
    def author(self, author):
        if not author: 
            self.author = "Unknown"
        else:
            self.author = author

Notez que normalement Python ne vous permet pas d'avoir plusieurs méthodes avec le même nom et le même nombre de paramètres. Cependant, dans ce cas, Python le permet à cause des décorateurs utilisés.

Si nous testons le code:

>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = ""  #Cos Some Guy didn't write this one!
>>> book.author 
Unknown 


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow