【问题标题】:Setter ignored when property is assigned to variable (Python 3.4)将属性分配给变量时忽略设置器(Python 3.4)
【发布时间】: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 = True v = Verdict().verdict v = True v = True

标签: python python-3.x properties setter


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 2021-09-20
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2022-01-07
    相关资源
    最近更新 更多