Python 属性装饰器

18

可能是重复问题:
如何在Python中使用属性特性的现实世界示例?

我对装饰器@property有一个问题,我在以下代码中看到了它。有人能够完全解释为什么要使用@property装饰器吗?我知道@property等同于isActive = property(isActive),但是方法property实际上对其参数执行了什么操作?如果我从InputCell类调用isActive方法,会发生什么?谢谢。

class InputCell(object):
    def __init__(self, ix, iy, inputData):
        self.ix = ix
        self.iy = iy
        self.InputData = inputData

    @property
    def isActive(self):
        return self.InputData[self.ix][self.iy]

2
装饰器的文档实际上在第三句话中解释了这一点:http://docs.python.org/py3k/library/functions.html?highlight=property#property - millimoose
如果你调用 InputCell().isActive(),你很可能会得到一个异常,说无论 inputData[ix][iy] 的值是什么,它都不能被调用。 - millimoose
5
@property用于将一个函数看作属性。你可以使用它来确保每次访问属性时都执行某些操作。例如,如果你有大量的代码使用以度为单位表示的角度参数,然后决定在内部跟踪弧度表示的角度,你可以创建属性方法隐藏内部使用弧度的事实。 - Russell Borogove
我知道这是老的,但你忘记在最后一行大写'i'了。应该是return self.InputData[self.ix][self.iy]。 - Erotemic
1个回答

25

这只是一种语法糖。它允许一个方法调用看起来像一个变量访问或赋值。

这种方式有用的一种情况是,如果你想改变以前是一个简单变量的东西,使它成为实际上使用其他代码进行计算或验证的东西。如果你将其设置为属性,则可以在不破坏任何现有代码的情况下完成此操作。另一种方式是用于对象属性的缓存、惰性初始化等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接