这就是我在Python中尝试做的事情:
class BaseClass:
def __init__(self):
print 'The base class constructor ran!'
self.__test = 42
class ChildClass(BaseClass):
def __init__(self):
print 'The child class constructor ran!'
BaseClass.__init__(self)
def doSomething(self):
print 'Test is: ', self.__test
test = ChildClass()
test.doSomething()
结果是:
AttributeError: ChildClass instance has no attribute '_ChildClass__test'
是什么给出的?为什么这不能像我期望的那样工作?
答案 0 :(得分:20)
来自python文档:
私有名称修改:当在类定义中以文本方式出现的标识符以两个或更多下划线字符开头,并且不以两个或多个下划线结尾时,它被视为私有名称那个班级。在为其生成代码之前,将私有名称转换为更长的格式。转换在名称前面插入类名,删除前导下划线,并在类名前面插入一个下划线。例如,名为 Ham 的类中出现的标识符 __ spam 将转换为 _Ham__spam 。此转换独立于使用标识符的语法上下文。如果转换后的名称非常长(超过255个字符),则可能会发生实现定义的截断。如果类名仅由下划线组成,则不进行转换。
因此,您的属性未命名为 __ test ,但 _BaseClass__test 。
但是你不应该依赖它,而是使用 self._test ,大多数python开发人员都知道该属性是类的内部部分,而不是公共接口。
答案 1 :(得分:5)
您可以使用Python的内省工具来获取您正在寻找的信息。 一个简单的目录(测试)会给你
['_BaseClass__test', '__doc__', '__init__', '__module__', 'doSomething']
注意'_BaseClass__test'。这就是你要找的东西。
查看this了解详情。
答案 2 :(得分:3)
双重下划线变量可被视为“私有”。它们被类名称破坏,其中包括保护多个基类不会覆盖其他成员。
如果您希望其他开发人员将您的属性视为私有,请使用单个下划线。