80 votes

'Impossible de définir l'attribut' avec les propriétés de nouveau style dans Python

J'essaie d'utiliser la déclaration de propriétés de nouveau style:

 class C(object):
    def __init__(self):
        self._x = 0

    @property
    def x(self):
        print 'getting'
        return self._x

    @x.setter
    def set_x(self, value):
        'setting'
        self._x = value

if __name__ == '__main__':
    c = C()
    print c.x
    c.x = 10
    print c.x
 

et voyez ce qui suit dans la console:

 pydev debugger: starting
getting
0
File "\test.py", line 55, in <module>
c.x = 10
AttributeError: can't set attribute
 

Qu'est-ce que je fais mal? PS: La déclaration à l'ancienne fonctionne bien.

115voto

Dave Webb Points 90034

La documentation dit ce qui suit à propos de l'utilisation de décorateur forme d' property:

Assurez-vous de donner les fonctions supplémentaires du même nom que l'original de la propriété (x) dans ce cas.)

Je n'ai aucune idée de pourquoi il en est, car si vous utilisez property que la fonction de retour d'un attribut de l'méthodes peuvent être appelées que vous désirez.

Si vous avez besoin de changer votre code de la manière suivante:

@x.setter
def x(self, value):
    'setting'
    self._x = value

14voto

La méthode setter doit avoir le même nom que le getter. Ne vous inquiétez pas, le décorateur sait les différencier.

 @x.setter
def x(self, value):
 ...
 

6voto

Kyle Points 58

Lorsque vous appelez @ x.setter, @ x.getter ou @ x.deleter, vous créez un nouvel objet de propriété et lui donnez le nom de la fonction que vous décorez. Donc vraiment, tout ce qui compte, c’est que la dernière fois que vous utilisez un décorateur @ x. * Er dans la définition de la classe, celui-ci a le nom que vous voulez réellement utiliser. Mais comme cela laisserait votre espace de noms de classe pollué par des versions incomplètes de la propriété que vous souhaitez utiliser, il est préférable d'utiliser le même nom pour les nettoyer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X