我正在创建一个 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/