2017-07-01 2 views
3

J'écris une classe python pour stocker des données, puis une autre classe crée une instance de cette classe pour imprimer différentes variables. Certaines variables de classe nécessitent beaucoup de formatage, ce qui peut prendre plusieurs lignes de code pour l'obtenir dans son "état final".Variables de classe Python ou @property

Est-ce une mauvaise pratique d'accéder simplement aux variables de l'extérieur de la classe avec cette structure?

class Data(): 
    def __init__(self): 
     self.data = "data" 

Ou est-il préférable d'utiliser une méthode @property pour accéder aux variables?

class Data: 
    @property 
    def data(self): 
     return "data" 
+5

La prise en charge des propriétés par le langage est telle que vous n'avez jamais à prendre cette décision. Vous commencez avec les attributs normaux et utilisez les propriétés quand elles ont du sens. –

+0

@ IgnacioVazquez-Abrams vous avez un point là ... Mais c'est un peu plus difficile à voir en python car toutes les propriétés sont accessibles par défaut. –

+1

Commencez par un simple accès aux attributs. Plus tard, si vous découvrez que vous devez contrôler l'accès, faites-en une propriété, mais seulement ensuite. C'est tout le * point *. –

Répondre

2

Attention, si vous faites:

class Data: 
    @property 
    def data(self): 
     return "data" 

d = Data() 
d.data = "try to modify data" 

vous donnera l'erreur:

AttributeError: can't set attribute

Et comme je vois dans votre question, vous voulez être en mesure de transformer les données jusqu'à son état final, donc, optez pour l'autre option

class Data2(): 
    def __init__(self): 
     self.data = "data" 

d2 = Data2() 
d2.data = "now I can be modified" 

ou modifier le previus:

class Data: 
    def __init__(self): 
    self._data = "data" 

    @property 
    def data(self): 
     return self._data 

    @data.setter 
    def data(self, value): 
    self._data = value 

d = Data() 
d.data = "now I can be modified" 
0

Fondamentalement, vous pourriez cacher beaucoup de complexité dans la propriété et la faire ressembler à un attribut. Cela augmente la lisibilité du code.

De même, vous devez comprendre la différence entre la propriété et l'attribut. S'il vous plaît se référer What's the difference between a Python "property" and "attribute"?

1

pratique commune

La pratique normale en Python est l'exposition des attributs directement. Une propriété peut être ajoutée ultérieurement si des actions supplémentaires sont requises lors de l'obtention ou de la configuration.

La plupart des modules de la bibliothèque standard suivent cette pratique. Les variables publiques (sans préfixe avec un trait de soulignement) n'utilisent généralement pas la propriété () sauf s'il existe une raison spécifique (comme la définition d'un attribut en lecture seule).

Justification

Accès attribut normal (sans propriété) est simple à mettre en œuvre, simple à comprendre, et court très vite.

La possibilité d'utiliser propriété() après signifie que nous ne devons pas pratiquer defensive programming. Nous pouvons éviter d'avoir à implémenter prématurément des getters et des setters qui gonflent le code et rendent les accès plus lents.