我有以下课程:
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'
出了什么问题以及如何纠正它?
答案 0 :(得分:1)
当您使用双下划线为属性添加前缀时,Python会使用“name mangling”来访问该属性。这意味着它将以下列格式将属性存储在类中:_<class name>__<attr name>
。在您的示例中,self.__label
将存储为self._B__label
,因为您在B类方法中设置它。但是当您尝试在A类中使用该属性时,它会将self.__label
转换为self._A__label
并发现它未设置。
双下划线的用例是,即使子类派生您的类,也要确保您的变量始终在您的类上。因为可能发生的是子类将你的变量重新定义为其他东西,使用双下划线变量使得这更难。