繁体   English   中英

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

[英]Python inheritance and calling parent class constructor

这就是我在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'

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

从python文档:

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

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

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

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

['_BaseClass__test', '__doc__', '__init__', '__module__', 'doSomething']

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

请查看以获取更多信息。

双下划线变量可以被视为“私有”。 它们被类名称破坏,其中包括保护多个基类不会覆盖每个成员。

如果您希望其他开发人员将您的属性视为私有,请使用单个下划线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM