Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “super”对象没有属性“\u Parent\u method”_Python_Python 3.x_Class_Subclass - Fatal编程技术网

Python “super”对象没有属性“\u Parent\u method”

Python “super”对象没有属性“\u Parent\u method”,python,python-3.x,class,subclass,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().

我已经阅读了所有关于这个主题的类似帖子,但没有一篇与我的问题相关,能够帮助我了解到底发生了什么

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”对象没有属性“\u B\u\u conn”


类C不应该从B继承变量吗?B从A继承变量吗?如果要在子类中使用这些名称,请不要使用前导双下划线名称。__名称被明确设计为使名称类私有,也就是说,仅对确切的类有用。其思想是,您可以在框架中使用这些名称,而不必限制子类可以使用的名称

这些名称在编译时被破坏;它们的_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
请参阅词法分析文档中的:

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

以及引用的:

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


为什么使用双下划线名称?这些都是为了避免可继承性而显式设计的。@martijnpieter它们是我的私有变量。这是我在学习编程时用另一种语言养成的习惯。@Spedwards:Python中除了类私有名之外没有隐私模型,而且您的用例不符合它们的目标。谢谢。我不知道整件事的来龙去脉。我不知道为什么,但我总是喜欢用双下划线而不是单下划线。我想现在该改变了。