类变量在赋值函数上失去作用域

2024-09-28 22:18:53 发布

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

我有一个关于类变量作用域赋值持久性的问题。在

我有一个dictionary作为一个类变量,当我在一个实例方法中为变量分配另一个字典时,范围似乎丢失了,并且值不再在实例之间持久化。在

以下是代码片段:

class MyBaseClass(object):
    my_class_dict = {}  

    def __init__(self):
        print "Keys length: ", len(self.my_class_dict)
        if not len(self.my_class_dict.keys()):
            print "Initializing my_class_dict."
            # VERION  1 
            # self.my_class_dict.update({1:2})
            # VERSION 2 
            # self.my_class_dict = {1:2}
            # VERSION 3             
            self.my_class_dict[1] = 2


class MyChildClass1(MyBaseClass):

    def __init__(self):
        super(MyChildClass1, self).__init__()


class MyChildClass2(MyBaseClass):

    def __init__(self):
        super(MyChildClass2, self).__init__()       

if __name__=='__main__':
    child_1 = MyChildClass1()
    child_2 = MyChildClass2()

    print child_1.my_class_dict
    print child_2.my_class_dict

这是结果。在

版本1(1初始化,范围持久化)

^{pr2}$

版本2(2次初始化,范围丢失)

Keys length:  0
Initializing my_class_dict.
Keys length:  0
Initializing my_class_dict.
{1: 2}
{1: 2}

版本3(1初始化,范围持久化)

^{pr2}$

因此,似乎只有在完整的对象赋值时才丢失作用域。为什么会这样?这样做的理由是什么?在


Tags: self版本childinitmydefkeyslength
1条回答
网友
1楼 · 发布于 2024-09-28 22:18:53

这完全是意料之中的。作用域不会“丢失”:通过赋值给self.my_class_dict,您可以创建一个实例属性,该属性隐藏同名的class属性。实例总是在类之前查找实例的属性,因此将首先找到新创建的变量。在

相关问题 更多 >