将属性分配给变量时,Setter会被忽略(Python 3.4)

时间:2018-08-15 20:58:42

标签: python python-3.x properties setter

我正在创建一个Verdict类,在将其设置为false之前,它将一直评估为true,此后即使您将其设置为true,它也始终将其评估为false。我唯一想到的方法是拥有一个财产和一个塞特犬。

它可以工作,但是为了简单而不是:

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

我认为我可以做到:

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

但是似乎第二种情况下的v直接是属性,并且忽略了设置器。

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 

是否有解决此问题的方法,或者是实现裁决的更好方法?

1 个答案:

答案 0 :(得分:1)

您无法避免使用v.verdict = ...语法。

这是因为属性需要属性访问才能起作用。属性为descriptors,描述符协议仅对属性访问有效。

如果将属性(或更一般地说,描述符)存储在变量中,则实际上已经丧失了其功能。访问变量只是一个名称查找,而分配给变量只是将值绑定到名称。像v = ...这样的任务无法触发您的设置者。