具有Python Inheritnence的未知AttributeError

具有Python Inheritnence的未知AttributeError,python,inheritance,Python,Inheritance,我有一个从Python中的抽象类继承的类 class MyAbstractClass(): __Var1 = 0 def __init__(self): pass class MySubClass(MyAbstractClass): def __init__(self): MyAbstractClass.__init__(self) def MyFunc(self): print self.__Var1 出现

我有一个从Python中的抽象类继承的类

class MyAbstractClass():
    __Var1 = 0

    def __init__(self):
        pass

class MySubClass(MyAbstractClass):
    def __init__(self):
        MyAbstractClass.__init__(self)

    def MyFunc(self):
        print self.__Var1
出现以下错误:

AttributeError: MySubClass instance has no attribute '_MySubClass__Var1'
值得注意的是,这两个类位于不同的文件中

我四处搜索过,大多数建议是将我的代码从使用“super()”改为显式的父级名称。然而,我仍然收到这个错误

知道发生了什么事吗?

你看到的是。以双下划线开头的名称以特殊方式处理,以避免子类中的名称冲突

基本上,只要类中有一个
\u some\u name
属性,它就会自动重命名为
\u YourClass\u some\u name
,以避免继承时发生名称冲突

您可以使用以下功能进行检查:

>>> class MyClass(object):
...     __var = 1
... 
>>> dir(MyClass)
['_MyClass__var', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
请注意列表如何不包含
\uu var
,而是包含
\u MyClass\uu var

解决方法很简单:不要使用以双下划线开头的变量名。如果要将变量标记为private,则约定使用单个下划线

我想再次强调,名称混乱的主要目的是避免与子类的名称空间冲突:

>>> class MyClass(object):
...     def __init__(self, val):
...             self._value = val
... 
>>> class MySubclass(object):
...     def __init__(self, val):
...             super(MyClass, self).__init__(val)
...             self._value = val ** 2  #this hides the base class attribute!
... 
请注意,如果基类来自第三方库,则无法知道定义了哪些私有属性,因为它们不是API的一部分。使用
dir
检查只会提示使用哪个名称,但由于它们是一个实现细节,因此可以在不通知的情况下进行更改

不应使用此选项将属性“标记”为私有属性。python的惯例是以一个下划线开头的属性是私有的

在一个相关主题中,名称开头和结尾都带有双下划线的
\uuu something\uuuu
形式的名称也被特别处理。其中一些实现了,因此您不应该使用这种标识符。

您看到的是。以双下划线开头的名称以特殊方式处理,以避免子类中的名称冲突

基本上,只要类中有一个
\u some\u name
属性,它就会自动重命名为
\u YourClass\u some\u name
,以避免继承时发生名称冲突

您可以使用以下功能进行检查:

>>> class MyClass(object):
...     __var = 1
... 
>>> dir(MyClass)
['_MyClass__var', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
请注意列表如何不包含
\uu var
,而是包含
\u MyClass\uu var

解决方法很简单:不要使用以双下划线开头的变量名。如果要将变量标记为private,则约定使用单个下划线

我想再次强调,名称混乱的主要目的是避免与子类的名称空间冲突:

>>> class MyClass(object):
...     def __init__(self, val):
...             self._value = val
... 
>>> class MySubclass(object):
...     def __init__(self, val):
...             super(MyClass, self).__init__(val)
...             self._value = val ** 2  #this hides the base class attribute!
... 
请注意,如果基类来自第三方库,则无法知道定义了哪些私有属性,因为它们不是API的一部分。使用
dir
检查只会提示使用哪个名称,但由于它们是一个实现细节,因此可以在不通知的情况下进行更改

不应使用此选项将属性“标记”为私有属性。python的惯例是以一个下划线开头的属性是私有的


在一个相关主题中,名称开头和结尾都带有双下划线的
\uuu something\uuuu
形式的名称也被特别处理。其中一些实现了,因此您永远不应该使用这种标识符。

Var1前面的双下划线没有名称损坏。运行时
\uuuvar1
看起来像
\umysubclass\uuuuvar1

尝试用一个下划线将其重命名为_Var1

名称混乱是Python创建某种私有变量的方式。这实际上是为了防止名称空间冲突


这方面有一些细节

Var1前面的双下划线没有名称损坏。运行时
\uuuvar1
看起来像
\umysubclass\uuuuvar1

尝试用一个下划线将其重命名为_Var1

名称混乱是Python创建某种私有变量的方式。这实际上是为了防止名称空间冲突


这方面有一些细节

双下划线故意混淆变量名,使其半私有。有关更多详细信息,请参阅


要解决此问题,请将
\uu Var1
更改为
\u Var1

双下划线故意混淆变量名,使其半私有。有关更多详细信息,请参阅


要解决此问题,请将
\uu Var1
更改为
\u Var1

您尚未说明您要实现的目标。_uuuvar1的目的是什么?你还没有说你想要实现什么。瓦拉的目的是什么?哎呀。不管什么原因,当我阅读python页面时,我的大脑会说“2个下划线”。现在可以了,谢谢。公共变量的正确语法是什么?@MintyAnt公共变量没有语法。Python不区分公共和私有,一切都是公共的。公共名称通常是不以下划线开头的名称。在您的示例中,您可以使用
Var1
,尽管我建议对变量/方法名称.Oops使用带下划线的
小写字母,而不是
CamelCase
。不管什么原因,当我阅读python页面时,我的大脑会说“2个下划线”。现在可以了,谢谢。公共变量的正确语法是什么?@MintyAnt公共变量没有语法。Python不区分公共和私有,一切都是公共的。公共名称通常是不以下划线开头的名称。在您的示例中,您可以使用
Var1
,尽管我建议对变量/方法名称使用带下划线的
小写字母,而不是
CamelCase