我正在创建一个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
是否有解决此问题的方法,或者是实现裁决的更好方法?
答案 0 :(得分:1)
您无法避免使用v.verdict = ...
语法。
这是因为属性需要属性访问才能起作用。属性为descriptors,描述符协议仅对属性访问有效。
如果将属性(或更一般地说,描述符)存储在变量中,则实际上已经丧失了其功能。访问变量只是一个名称查找,而分配给变量只是将值绑定到名称。像v = ...
这样的任务无法触发您的设置者。