类变量在赋值时失去范围

时间:2014-07-09 12:09:00

标签: python scope initialization variable-assignment class-variables

我对分配时的类变量范围持久性有疑问。

我有一个字典作为类变量,一旦我在实例方法中为变量分配了另一个字典,范围似乎就会丢失,并且值不再存在于实例之间。

以下是代码段:

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

以下是结果。

VERSION 1(1个初始化,范围保持不变)

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

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

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

VERSION 3(1个初始化,范围保持不变)

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

因此看起来范围只会在完整对象分配时丢失。为什么会这样?这是什么理由?

1 个答案:

答案 0 :(得分:3)

完全可以预料到这一点。范围不会丢失":通过分配给self.my_class_dict,您可以创建一个实例属性,该属性使用相同的名称隐藏类属性。实例总是在类之前查找实例上的属性,因此将首先找到新创建的变量。

相关问题