具有Python Inheritnence的未知AttributeError
我有一个从Python中的抽象类继承的类具有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 出现
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
。