在测试某些代码时,我遇到了一些意外的行为,当时我试图访问子类(_var)的name-mangled属性。我以为我得到的不是子类的值,而是父类的_变量
最终编辑:子对象访问自己版本的变量,该变量的名称被父对象的名称而不是自己的名称弄乱。以前意想不到的行为现在已经被理解了
class test_parent(object):
__var = 1
def getvar(self):
a = self.__class__.__var
return a
class test_child(test_parent):
__var = 2
a = test_parent()
b = test_child()
b.__class__._test_parent__var = 3
print(a.getvar()) # Prints 1, as expected
print(b.__class__._test_child__var) # Prints 2, as expected
print(b.__class__._test_parent__var) # Prints 3, as expected
print(b.getvar()) # Prints 3
在评论的帮助下回答:
当解释器“读取”该方法时(可能不是正确的术语),而不是调用该方法时,就会出现Python名称混乱。测试证明了在后台发生的过程
第一次遇到_var时,它位于test_parent的主体内,并且名称已损坏:
变成:
当在
test_child
中遇到__var
时,会发生类似的情况,变成_test_child__var
。发生之前意外的行为是因为在getvar中发生了同样的事情变成:
这就是为什么测试代码
b.getvar()
一旦b.__class__._test_parent__var
被赋值,就会返回3
,因为这是getvar方法访问的值相关问题 更多 >
编程相关推荐