【问题标题】:How does Python know to call setter/getter methods with properties [duplicate]Python如何知道调用具有属性的setter / getter方法[重复]
【发布时间】:2018-02-05 04:13:41
【问题描述】:

我的代码:

class MyClass:

    def __init__(self):
        self.value = 0

    def set_value(self, value):
        self.value = 5

    def get_value(self):
        return self.value

    value = property(get_value, set_value)

a = MyClass()

我得到以下输出:

RecursionError: maximum recursion depth exceeded

我的问题:为什么我会得到这个输出?为什么 Python 调用 MyClass.value.__set__ 而不是仅仅将 instance 变量 设置为 0?

我的意思是属性对象是一个类变量,在初始化a-instance 时,我不对类变量做任何事情。希望你明白我的意思。

【问题讨论】:

  • 有趣的输出,我没想到会这样。只是想补充一点,将value 设为私有变量(替换为__value)可以解决问题。
  • @Michael 不会将其设为私有,它只是将其命名为破坏它。只要属性后面的属性具有不同的名称(通常使用 单个 前导下划线,但可能完全不同),就没有递归。
  • 它调用MyClass.value.__set__,因为这就是属性的工作方式。否则,您只需在分配给它时立即用一个值替换该属性。
  • 我会在这里发布答案,但不能因为问题已关闭。我不认为它是完全重复的,因为您正在询问错误。发生的事情是您正在引入无限递归。 __init__ 包含self.value=0,它被解释为self.set_value(0),其中包含self.value = 5,它被解释为self.set_value(5),并且该方法再次调用自身,并且再次类似地引入无限递归。您需要为状态变量使用与属性不同的名称,_value 通常是约定。

标签: python


【解决方案1】:

通过value = property(get_value, set_value) 声明一个新的描述符。从现在开始instance.valueinstance.value = x 将调用.get_value().set_value()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-06-27
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多