2 votes

Setter ignoré lorsque la propriété est assignée à une variable (Python 3.4)

Je crée une classe Verdict qui sera évaluée comme vraie jusqu'à ce qu'elle soit définie comme fausse, après quoi elle sera toujours évaluée comme fausse même si vous la définissez comme vraie. Le seul moyen auquel j'ai pensé pour faire cela serait d'avoir une propriété et un paramètre.

Cela fonctionne, mais pour la simplicité plutôt que pour l'avoir :

v = Verdict()
v.verdict = ...
v.verdict = ...
v.verdict = ...

Je pensais que je pouvais le faire :

v = Verdict().verdict
v = ...
v = ...
v = ...

Mais il semble que v dans le second cas soit l'attribut directement, et ignore le setter.

class Verdict():
    def __init__(self):
        self.__verdict = True

    @property
    def verdict(self):
        return self.__verdict

    @verdict.setter
    def verdict(self, value):
        if self.__verdict is True:
            self.__verdict = value

    def __bool__(self):
        return self.__verdict

class A():
    v = Verdict().verdict
    y = Verdict()

    def foo(cls):
        cls.y = False
        cls.y = True # Uses setter and stays false
        cls.v = False
        cls.v = True # should use setter and stay false but doesn't 

Existe-t-il un moyen de résoudre ce problème ou une meilleure méthode pour obtenir le verdict ?

1voto

Aran-Fey Points 20414

Vous ne pouvez pas éviter d'utiliser le v.verdict = ... la syntaxe.

En effet, les propriétés nécessitent un accès aux attributs pour pouvoir fonctionner. Les propriétés sont descripteurs et le protocole des descripteurs ne prend effet que lors de l'accès aux attributs.

Si vous stockez une propriété (ou, plus généralement, un descripteur) dans une variable, vous la privez effectivement de sa fonctionnalité. L'accès à une variable n'est qu'une recherche de nom, et l'affectation à une variable ne fait que lier une valeur à un nom. Il n'est pas possible de faire une affectation du type v = ... déclencher votre setter.

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