【问题标题】:How does python differentiate an instance property from a decorated property with the same name?python如何区分实例属性和具有相同名称的装饰属性?
【发布时间】:2021-07-17 13:34:56
【问题描述】:
class Product:
    def __init__(self, value):
        self.price = value

    @property
    def price(self):
        return self.price

    @price.setter
    def price(self, value):
        self.price = value


p = Product(90)

运行上面的代码会抛出这个错误RecursionError: maximum recursion depth exceeded,说self.price = value被重复了多次。但是,当我在装饰器 propertyprice.setter 下使用双下划线即 __self.priceself.price 加上前缀时,错误就会消失。

class Product:
    def __init__(self, value):
        self.price = value

    @property
    def price(self):
        return self.__price

    @price.setter
    def price(self, value):
        self.__price = value


p = Product(90)

双下划线到底有什么变化?

【问题讨论】:

    标签: python class recursion python-decorators


    【解决方案1】:

    由于函数和变量名称的命名约定相同,您会收到错误消息。您首先将变量名称初始化为price,然后您还再次声明了您的函数名称price。无限调用相同的命名约定价格并且递归超过了他的限制,因此您会收到此错误。试试这个

    class Product:
        def __init__(self, value):
            self.price = value
    
        @property
        def prices(self):
            return self.price
    
        @prices.setter
        def prices(self, value):
            self.price = value
    
    
    p = Product(90)
    print(p.price)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      相关资源
      最近更新 更多