当 属性 被分配给变量时 Setter 被忽略 (Python 3.4)
Setter ignored when property is assigned to variable (Python 3.4)
我正在创建一个 Verdict class,它将评估为 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,描述符协议只对属性访问生效
如果您将 属性(或者更一般地说,描述符)存储在一个变量中,您实际上已经剥夺了它的功能。访问变量只是名称查找,而分配给变量只是将值绑定到名称。无法让 v = ...
之类的作业触发您的 setter.
我正在创建一个 Verdict class,它将评估为 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,描述符协议只对属性访问生效
如果您将 属性(或者更一般地说,描述符)存储在一个变量中,您实际上已经剥夺了它的功能。访问变量只是名称查找,而分配给变量只是将值绑定到名称。无法让 v = ...
之类的作业触发您的 setter.