6

我试图了解 Python 中 @property 装饰器的实用性。具体来说,我使用如下属性设置了一个类:

class A(object):
    def __init__(self, x):
        self._x = x

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, new_x):
        self._x = new_x

我还设置了一个没有提供相同功能的属性的类:

class B(object):
    def __init__(self, x):
        self._x = x

我为每个创建一个实例:

a = A(10)
b = B(10)

在 iPython 中运行 %timeit 会产生以下结果

%timeit a.x
%timeit b._x

1000000 次循环,3 次中的最佳:每个循环 213 ns

10000000 次循环,3 次中的最佳:每个循环 67.9 ns

%timeit a.x = 15
%timeit b._x = 15

1000000 次循环,3 次中的最佳:每个循环 257 ns

10000000 次循环,3 次中的最佳:每个循环 89.7 ns

显然,@property 和 @setter 装饰器在你与对象交谈的频率很高时效果较差。我的问题很简单,为什么要使用它?我很想听听人们可能拥有的这些装饰器的任何用例。谢谢。

4

2 回答 2

5

简单的答案是您不将propertys 用于基本属性。它们对于在存储或检索时需要额外逻辑的属性很有用。例如,具有从其他属性或需要错误检查或其他专门过滤的属性派生的值的属性。使用propertys 可以让您在单点菜单中使用其他语言中常见的常见 setter/getter 模式,而不是强制使用冗长的样板文件。

于 2014-01-16T22:59:46.140 回答
1

如果属性如此简单,请不要使用property. 你不需要它。property是否存在获取和设置属性需要做更多事情的情况,例如,如果涉及计算:

@property
def area(self):
    return math.pi * self.radius**2

__dict__当以前简单的查找突然需要执行额外的工作时,它们特别有用。您可以切换到一个属性,而无需在每个调用站点添加方法调用括号。

于 2014-01-16T23:01:04.533 回答