'超'对象没有属性' _Parent__method'

时间:2017-09-03 11:49:52

标签: python python-3.x class subclass

我已经阅读了有关此主题的所有类似帖子,但没有发现我的问题与我的问题相关,这有助于我弄清楚发生了什么。

class A:
    def __init__(self, value):
        self.__value = value
        self.__conn = httpsconnection # Specifics don't matter

class B(A):
    def __init__(self, id, type, value):
        super().__init__(value)
        self.data = self.__create_sub_class(id, type)

    def __create_sub_class(self, id, type):
        self.__conn.request(...)
        ...
        return data

class C(B):
    def __init__(self, id, value):
        super().__init__(id, externalVariable, value)

我得到的错误是AttributeError: 'C' object has no attribute '_B__conn'

该类C是否应继承B中从A继承的变量?

1 个答案:

答案 0 :(得分:1)

如果要在子类中使用这些名称,请不要使用前导双下划线名称。 <div style="margin: 0 20px;"> <div class="bg-image"> </div> </div>明确设计为使名称​​ class private ,即仅对完全类有用。我们的想法是你可以在框架中使用这些名称,而不限制子类可以使用的名称。

这些名称在编译时被损坏;它们以__name为前缀(使用当前的类名称)。如果您想要表明名称是内部的(Python没有实际的隐私模型,名称始终可访问),只需使用单个下划线名称:

_ClassName

请参阅词法分析文档中的Reserved classes of identifiers

  

class A: def __init__(self, value): self._value = value self._conn = httpsconnection # Specifics don't matter class B(A): def __init__(self, id, type, value): super().__init__(value) self.data = self._create_sub_class(id, type) def _create_sub_class(self, id, type): self._conn.request(...) ... return data
  类私有名称。当在类定义的上下文中使用时,此类别中的名称将被重写以使用损坏的表单来帮助避免基类和派生类的“私有”属性之间的名称冲突。

和引用的documentation on names

  

私有名称修改:当在类定义中以文本方式出现的标识符以两个或多个下划线字符开头且不以两个或多个下划线结尾时,它被视为该类的私有名称。在为其生成代码之前,将私有名称转换为更长的形式。转换将在名称前面插入类名,删除前导下划线并插入单个下划线。例如,名为Ham的类中出现的标识符__*将转换为__spam。此转换独立于使用标识符的语法上下文。