在我运行此代码之前,我认为它们是相同的:
class B(object):
def show(self):
self.__a = "test"
print "B"
def this_b(self):
print "this_b"
print self.__a
print getattr(self, '__a') #exception
class C(B):
def show(self):
print "C"
# B.show(self)
super(C, self).show()
def call(self):
print "call"
self.show()
self.this_b()
# print self.__a
C().call()
它使用AttributeError: 'C' object has no attribute '__a'
语句引发getattr
,但为什么?
答案 0 :(得分:11)
私有名称修改:当在类定义中以文本方式出现的标识符以两个或多个下划线字符开头且不以两个或多个下划线结尾时,它被视为该类的私有名称。在为其生成代码之前,将私有名称转换为更长的形式。转换将在名称前面插入类名,删除前导下划线并插入单个下划线。例如,名为
__spam
的类中出现的标识符Ham
将转换为_Ham__spam
。此转换独立于使用标识符的语法上下文。如果转换后的名称非常长(超过255个字符),则可能会发生实现定义的截断。如果类名仅由下划线组成,则不进行转换。
当你这样做时
self.__a
私人名称修改将自动处理。但是当你做的时候
print getattr(self, '__a')
你必须手动完成,比如
print getattr(self, '_B__a')
# test