使用方法定义的父项时出错 class
error when using method defined parent class
我有以下 类:
class A:
def name(self):
return self.__label
class B(A):
def __init__(self, name)
self.__label = name
ex1 = B('Tom')
print ex1.name()
我得到的是:
AttributeError: B instance has no attribute '_A__label'
有什么问题以及如何纠正?
当您使用双下划线作为属性前缀时,Python 使用“name mangling”来访问该属性。这意味着它将以 class 格式存储属性:_<class name>__<attr name>
。在您的示例中,self.__label
将存储为 self._B__label
,因为您在 B class 方法中设置了它。但是,当您尝试使用 A class 中的属性时,它将 self.__label
转换为 self._A__label
并发现它未设置。
双下划线的用例是您希望确保您的变量始终在您的 class 上,即使子 class 派生了您的 class。因为可能发生的是 subclass 将您的变量重新定义为其他变量,使用双下划线变量会使这变得更加困难。
我有以下 类:
class A:
def name(self):
return self.__label
class B(A):
def __init__(self, name)
self.__label = name
ex1 = B('Tom')
print ex1.name()
我得到的是:
AttributeError: B instance has no attribute '_A__label'
有什么问题以及如何纠正?
当您使用双下划线作为属性前缀时,Python 使用“name mangling”来访问该属性。这意味着它将以 class 格式存储属性:_<class name>__<attr name>
。在您的示例中,self.__label
将存储为 self._B__label
,因为您在 B class 方法中设置了它。但是,当您尝试使用 A class 中的属性时,它将 self.__label
转换为 self._A__label
并发现它未设置。
双下划线的用例是您希望确保您的变量始终在您的 class 上,即使子 class 派生了您的 class。因为可能发生的是 subclass 将您的变量重新定义为其他变量,使用双下划线变量会使这变得更加困难。