类中的函数访问的变量

时间:2019-07-27 17:55:45

标签: python

为什么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())

1 个答案:

答案 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的原因。)