Python继承和调用父类构造函数

Kei*_*Jr. 14 python oop

这就是我在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()
Run Code Online (Sandbox Code Playgroud)

结果如下:

AttributeError: ChildClass instance has no attribute '_ChildClass__test'
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?为什么这不能像我期望的那样工作?

Woj*_*ski 20

从python文档:

专用名称修改:当在类定义中文本方式出现的标识符以两个或多个下划线字符开头且不以两个或多个下划线结尾时,它将被视为该类的私有名称.在为其生成代码之前,私有名称转换为更长的形式.转换在名称前插入类名,删除前导下划线,并在类名前面插入单个下划线.例如,名为Ham的类中出现的标识符__spam将转换为_Ham__spam.此转换独立于使用标识符的语法上下文.如果转换后的名称非常长(超过255个字符),则可能会发生实现定义的截断.如果类名仅由下划线组成,则不进行转换.

因此,您的属性不是__test而是_BaseClass__test.

但是你不应该依赖它,使用self._test而大多数python开发人员都知道该属性是类的内部部分,而不是公共接口.


par*_*toa 5

您可以使用Python的内省工具来获取您正在寻找的信息.一个简单的目录(测试)会给你

['_BaseClass__test', '__doc__', '__init__', '__module__', 'doSomething']
Run Code Online (Sandbox Code Playgroud)

注意'_BaseClass__test'.这就是你要找的东西.

请查看以获取更多信息.