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中除了类私有名之外没有隐私模型,而且您的用例不符合它们的目标。谢谢。我不知道整件事的来龙去脉。我不知道为什么,但我总是喜欢用双下划线而不是单下划线。我想现在该改变了。