【发布时间】:2019-01-22 18:45:52
【问题描述】:
我正在创建一个 Verdict 类,该类将评估为 true,直到设置为 false,之后即使您将其设置为 true,它也始终评估为 false。我能想到的唯一方法是拥有一个属性和一个 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
有没有办法解决这个问题,或者有更好的方法来实现判决?
【问题讨论】:
-
如果您更改了
x = y; x = 3,您会期望y发生变化吗? -
你是从 C++ 转向 Python 吗?如果是这样,解释为什么事情不同就有点复杂了(除非你可以忘记你从 C++ 中学到的东西,并把它当作一个新程序员来思考)。
-
无论如何,。
v = <something>只是说“使v成为通过评估<something>获得的值的名称。这是通过要求适当的(本地或全局)命名空间将<something>存储在名称v下完成的。但是@ 987654331@ 的意思是“将v.verdict命名为通过评估<something>获得的值的名称”,这只能通过要求v来完成,这是通过调用v.__setattr__('verdict', <the value>)来完成的。 -
@user2357112。 IDK 如果 x 是一个指针,y 是一个地址,那么是的。对于 C++ 程序员来说,这很奇怪。我可以将 Python 变量分配给函数,那么 x 是变量还是函数指针?我期待如果我将 x 分配给参数,那么它将是指向参数的指针,而不是基础属性。但似乎不是。我不认为我理解参数实际上是什么,我想我需要阅读装饰器。
-
@abarnet 我的逻辑是:
Verdict().verdict = Truev = Verdict().verdictv = Truev = True
标签: python python-3.x properties setter