web-dev-qa-db-fra.com

Python Dataclass et décorateur de propriétés

J'ai lu sur Python 3.7 comme alternative aux couples nommés (ce que j'utilise généralement lorsque je dois grouper des données dans une structure). Je me demandais si la classe de données est compatible avec le décorateur de propriétés pour définir les fonctions getter et setter pour les éléments de données de la classe de données. Dans l'affirmative, est-ce décrit quelque part ou existe-t-il des exemples?

12
GertVdE

Cela fonctionne bien:

from dataclasses import dataclass

@dataclass
class Test:
    _name: str="schbell"

    @property
    def name(self) -> str:
        return self._name

    @name.setter
    def name(self, v: str) -> None:
        self._name = v

t = Test()
print(t.name) # schbell
t.name = "flirp"
print(t.name) # flirp
print(t) # Test(_name='flirp')

En fait, pourquoi ne le ferait-il pas? En fin de compte, ce que vous obtenez n'est qu'une bonne vieille classe, dérivée de type:

print(type(t)) # <class '__main__.Test'>
print(type(Test)) # <class 'type'>

C'est peut-être pourquoi les propriétés ne sont nulle part mentionnées spécifiquement. Cependant, le Résumé du PEP-557 mentionne l'utilisabilité générale des fonctionnalités de classe bien connues Python:

Étant donné que les classes de données utilisent la syntaxe de définition de classe normale, vous êtes libre d'utiliser l'héritage, les métaclasses, les docstrings, les méthodes définies par l'utilisateur, les fabriques de classes et d'autres fonctionnalités de classe Python.

11
shmee