python - 将属性分配给变量时忽略 Setter (Python 3.4)

标签 python python-3.x properties setter

我正在创建一个 Verdict 类,它将评估为 true,直到它被设置为 false,之后它总是评估为 false,即使你将它设置为 true。我能想到的唯一方法是拥有一个属性和一个 setter。

它有效,但为了简单起见而不是:

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

我以为我可以做到:

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

但似乎第二种情况下的 v 直接是属性,并且忽略了 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 

有没有办法解决这个问题,或者有更好的方法来实现判决?

最佳答案

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

这是因为属性需要属性访问才能工作。属性是 descriptors ,描述符协议(protocol)只对属性访问生效。

如果您在变量中存储一个属性(或者更一般地说,一个描述符),您实际上已经剥夺了它的功能。访问变量只是名称查找,而分配给变量只是将值绑定(bind)到名称。不可能让像 v = ... 这样的赋值触发你的 setter。

关于python - 将属性分配给变量时忽略 Setter (Python 3.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51866342/

相关文章:

python - 如何用新行和冒号解析一行?

python - 将图像临时存储在 Google App Engine 中?

python - 如何在 django 中的单独行上显示此数组 [45,70,65] 的每个内容

python - Pandas -日期时间的累计总和并每天重新开始

C# 属性 : Validation in getters or setters?

python - 如何更改 virtualenv 中依赖项应用程序中的模型

python - 计时需要多长时间

python-3.x - 使用条件更改嵌套列表

javascript - JS 中是否有相当于 Python 的 .get() 的功能?

java - 逐行在属性文件中添加注释