2008-10-02 73 views
1

一个关于Python的非常好的东西一类是与你能说出具有相同的名称作为访问变量简单:子类化与私有成员

self.__value = 1 

def value(): 
    return self.__value 

是否有提供接入的简单方法给我想要继承的类的私人成员?通常我只想简单地使用类中的原始数据对象,而不必一直使用访问器和增变器。

我知道这似乎违背了私人和公共的一般想法,但通常我想要继承的类是我自己的类之一,我很高兴将成员公开给子类,但不是该类的实例。提供这种区分有没有一种干净的方式?

回答

5

不方便,没有进一步破解封装。双下划线属性通过为其被访问的类预先添加'_ClassName'来改变名称 - 因此,如果您有'__value'属性的'ContainerThing'类,该属性实际上被存储为'_ContainerThing__value ”。更改类名称(或重构指定属性的位置)意味着打破尝试访问该属性的所有子类。

这正是为什么双下划线名称mangling(这不是真正的“私有”,只是“不方便”)是一个坏主意使用。只需使用单个前导下划线。每个人都会知道不要触摸你的'私人'属性,你仍然可以在子类和其他方便使用的情况下访问它。名称 - 双下划线属性的修改仅用于避免名称冲突,这些名称冲突对于特定于特定类的特定属性非常罕见。它没有提供额外的“安全性”,因为即使名称损坏的属性也很容易访问。

为了记录在案, '__value' 和 'value'(和 '_value')是不一样的名字。下划线是名字的一部分。

2

不知道该从哪里引用,但关于访问保护的以下声明是Pythonic canon:“我们都同意这里的成年人。

就像Thomas Wouters所说的那样,一个单独的前导下划线是将属性标记为对象内部状态的一部分的惯用方式。两个下划线仅提供名称修改以防止轻松访问该属性。

之后,你应该想到的是磁带库的客户不会去,并通过与“私有”属性插手搬起石头砸自己的脚。