为什么val_n函数返回较旧的self .__ n值?在我看来,如果obj .__ n已更新为3,则调用self.val__n应该返回3而不是2。
class myClass:
def __init__(self,n=1):
self.__n=n
def val_n(self):
return self.__n
#create an instance, __n is 2
obj=myClass(2)
#update __n to 3
obj.__n=3
#verify obj.__n has changed from 2 to 3
print(obj.__n)
#why does this still return 2?
print(obj.val_n())
答案 0 :(得分:2)
这是基于Python的名称处理功能。对类属性使用前导双下划线表示Python将使用名称修饰。
class X:
__attr = None
x = X()
x.__attr
# raises AttributeError
x._X__attr
# None
Python将类__attr
中的名称X
转换为_X__attr
,以便在子类化时,如果子类也定义了__attr
,则该属性不太可能被覆盖,但是父类的属性是必需的。
执行x.__n = 3
时,您不会覆盖该类中定义的属性,因为该属性已成为任何外部访问者的x._myClass__n
。相反,您正在创建一个新属性(Python在分配它之前实际上并不会检查x.__n
来查看它是否已经是对象的属性-这就是为什么不引发AttributeError
的原因。)