python - 类变量在赋值时失去作用域

标签 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

这是结果。

版本 1(1 个初始化,范围保留)

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

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

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

版本 3(1 个初始化,范围保留)

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

所以看起来好像只有在完整的对象分配时才会丢失作用域。为什么会出现这种情况?这样做的理由是什么?

最佳答案

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

关于python - 类变量在赋值时失去作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24653307/

相关文章:

python - TensorFlow:tf.layers 与低级 API

c++ - 返回传递给对象的引用

java - 为什么 Java 中的 switch 语句的范围没有限制?

c++ - vector 中类元素的初始化

python - Caffe 中的图像分类总是返回相同的类

python - 在 python 3.6 上工作但在 3.7.3 上不工作的方法的内存

python - 部署 django 时自动终止 fastcgi 进程

javascript - JavaScript 执行时序中的奇怪行为

Swift 初始化悖论

C++ vector 在 Release模式下未初始化为空