使用方法定义的父类时出错

时间:2015-11-12 22:08:30

标签: python class oop inheritance instance

我有以下课程:

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'

出了什么问题以及如何纠正它?

1 个答案:

答案 0 :(得分:1)

当您使用双下划线为属性添加前缀时,Python会使用“name mangling”来访问该属性。这意味着它将以下列格式将属性存储在类中:_<class name>__<attr name>。在您的示例中,self.__label将存储为self._B__label,因为您在B类方法中设置它。但是当您尝试在A类中使用该属性时,它会将self.__label转换为self._A__label并发现它未设置。

双下划线的用例是,即使子类派生您的类,也要确保您的变量始终在您的类上。因为可能发生的是子类将你的变量重新定义为其他东西,使用双下划线变量使得这更难。