【问题标题】:Why should I use the @property decorator in python?为什么我应该在 python 中使用@property 装饰器?
【发布时间】:2018-02-03 14:28:51
【问题描述】:

我一直在阅读 Python 教程,其中简要讨论了属性。据我了解,当请求类属性时,python 会将请求定向到返回属性的属性方法,以便可以在访问属性之前运行代码。但是为什么这是必要的,在下面的例子中,返回的属性 v 甚至不能用点表示法访问?

@property
def value(self):
    if self.is_face_up:
        v = BJ_Card.RANKS.index(self.rank) + 1
        if v > 10:
            v = 10
    else:
        v = None
    return v 

【问题讨论】:

  • “被返回的属性甚至不能用点表示法访问” 你什么意思? YourClass().value 工作得很好。
  • 是的,我现在意识到您可以在方法上使用点表示法 - 将其视为变量 v。当我写这个问题时,我很困惑,因为我无法通过键入 MyClass 来获取变量 v .v 但现在我知道这不是必需的,因为您可以调用该方法。

标签: python class properties decorator


【解决方案1】:

无法在函数内部使用点符号访问属性,因为这会递归调用属性getter并导致堆栈溢出:

class A:
    @property
    def x(self):
        return self.x # StackOverflow

但是,@property 的全部意义在于完全,以便通过点符号访问它。以下是等价的:

# Without @property
class A:
    def x(self):
        return 3

a = A()
print(a.x()) # prints 3

# With @property
class A:
    @property
    def x(self):
        return 3

a = A()
print(a.x) # prints 3

【讨论】:

  • 所以,澄清一下,当您使用属性装饰器时,您将方法视为属性。它只是一种为类创建属性但可以对其进行控制的方法吗?
  • @IsaacJohnson:是的,@property 将属性访问转换为方法调用,使属性动态化。
  • 谢谢,我很困惑,但你真的为我解决了问题。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 2012-12-08
  • 2012-10-17
  • 2016-03-14
相关资源
最近更新 更多