【问题标题】:'super' object has no attribute '_Parent__method' [duplicate]“超级”对象没有属性“_Parent__method”[重复]
【发布时间】:2018-02-11 20:55:29
【问题描述】:

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

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 继承它?

【问题讨论】:

  • 为什么要使用双下划线名称?这些是为了避免可继承性而明确设计的。
  • @MartijnPieters 它们是我的私有变量。我在学习编程时用另一种语言养成的习惯。
  • @Spedwards:除了类私有名称之外,Python 中没有隐私模型,而且您的用例不符合他们的目标。

标签: python python-3.x class subclass


【解决方案1】:

如果您想在子类中使用这些名称,请不要使用前导双下划线名称。 __name 明确设计为使名称​​类私有,即仅对确切的类有用。这个想法是您可以在框架中使用这些名称,而无需限制子类可以使用的名称。

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

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

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

__*
类私有名称。此类别中的名称在类定义的上下文中使用时,会被重写以使用重整形式,以帮助避免基类和派生类的“私有”属性之间的名称冲突。

以及引用的documentation on names

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

【讨论】:

  • 谢谢。我不知道整个名字修改。我不知道为什么,但我一直更喜欢使用双下划线而不是单下划线。我想现在必须改变。
猜你喜欢
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 2020-11-17
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
相关资源
最近更新 更多