使用私有成员对类进行子类化

Dan*_*Dan 2 python oop encapsulation

关于python的一个非常好的事情是,你可以简单地命名与访问者同名的变量:

self.__value = 1

def value():
    return self.__value
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法来提供对我希望子类化的类的私有成员的访问?通常我希望简单地使用类中的原始数据对象,而不必一直使用访问器和变换器.

我知道这似乎违背了私有和公共的一般概念,但通常我尝试子类的类是我自己的类,我很乐意将成员公开给子类但不公开该类的实例.有没有一种干净的方式来提供这种区别?

Tho*_*ers 5

不方便,没有进一步破坏封装.双下划线属性通过在其所访问的类前面添加'_ClassName'来进行名称修改.因此,如果您有一个'__value'属性的'ContainerThing'类,该属性实际上存储为' _ContainerThing__value' .更改类名(或重构属性的位置)将意味着破坏尝试访问该属性的所有子类.

这正是为什么双下划线名称修改(这不是真正的"私有",只是"不方便")是一个坏主意使用.只需使用一个单一的前导下划线.每个人都知道不要触摸你的"私人"属性,你仍然可以在子类和其他方便的情况下访问它.双重下划线属性的名称修改仅用于避免特定于特定类的属性的名称冲突,这种情况极为罕见.它没有提供额外的"安全性",因为即使是名称错误的属性也可以轻易访问.

对于记录,' __value'和' value'(和' _value')不是同一个名字.下划线是名称的一部分.