属性名称与父类名称(在第一次解析时)而不是子类名称(在实例化/调用时)冲突

2024-06-23 03:09:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在测试某些代码时,我遇到了一些意外的行为,当时我试图访问子类(_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

Tags: 对象代码testself名称childvaras
1条回答
网友
1楼 · 发布于 2024-06-23 03:09:45

在评论的帮助下回答:

当解释器“读取”该方法时(可能不是正确的术语),而不是调用该方法时,就会出现Python名称混乱。测试证明了在后台发生的过程

第一次遇到_var时,它位于test_parent的主体内,并且名称已损坏:

class test_parent(object):
    __var = 1

变成:

class test_parent(object):
    _test_parent__var = 1

当在test_child中遇到__var时,会发生类似的情况,变成_test_child__var。发生之前意外的行为是因为在getvar中发生了同样的事情

class test_parent(object):
    ...
    def getvar(self):
        ...
        a = self.__class__.__var

变成:

class test_parent(object):
    ...
    def getvar(self):
        ...
        a = self.__class__._test__parent_var

这就是为什么测试代码b.getvar()一旦b.__class__._test_parent__var被赋值,就会返回3,因为这是getvar方法访问的值

相关问题 更多 >

    热门问题