我应该使用属性还是私有属性?

3
假设我创建了一个类:
class SomeClass:    
    def __init__(self, some_attribute):
        self._attribute = some_attribute

    @property
    def attribute(self):
        return self._attribute

接下来,我给我的对象添加了一个名为new_method的方法,该方法将使用“attribute”。 因此,我应该使用self._attribute还是self.attribute

def new_method(self):
    DoSomething(self.attribute) # or     DoSomething(self._attribute)

这会产生任何影响或差异吗?


如果你要使用属性的话就用property吧。但在这种情况下,我不会一开始就使用属性。只需使用普通属性即可。 - juanpa.arrivillaga
为什么创建属性而不使用它?对于普通业务应用程序来说,开销可以忽略不计。如果您每微秒调用一次属性,那么我们可以开始谈论性能。如果您创建一个属性,那么您就不想访问原始值。这会防止您获得属性的好处,即解耦类的内部数据表示。 - whymatter
2个回答

6

使用self.attribute将触发调用SomeClass.attribute.__get__,因此会带来更多的开销。

使用self._attribute会带来较少的开销,但是一旦您对attribute的定义添加了有意义的逻辑,就会在代码中引入一个bug。

我的建议是始终使用self.attribute。如果getter成为瓶颈,请考虑使用缓存策略,而不是在类内不一致地使用_attributeattribute。 Sooner or later you will introduce a bug.


1
__get __() 的开销不是微不足道的吗?我想这种开销不值得,可能会引入引用预处理的私有属性时实际上需要后处理的麻烦。 - r.ook
@Idlehands 在你编写复杂的操作之前,它的开销是可以忽略不计的。原则上,里面可能包含任何东西。 - timgeb

3

我个人的观点是使用 self.attribute。原因是它的实现方式可能会改变。

在这里,它被存储为另一个实例变量,但出于任何原因,它以后可以被存储在底层对象中。

与直接访问相比,这种实现显然会有一些额外开销。


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