【问题标题】:Class variable losing scope on assignment类变量在赋值时失去作用域
【发布时间】:2014-08-30 10:57:54
【问题描述】:

我有一个关于赋值时类变量范围持久性的问题。

我有一个字典作为类变量,一旦我将另一个字典分配给实例方法中的变量,范围似乎丢失并且值不再在实例之间保留。

这里是sn-p的代码:

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}

所以看起来范围似乎只在完整的对象分配时丢失。为什么会这样?这样做的理由是什么?

【问题讨论】:

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


    【解决方案1】:

    这完全是意料之中的。范围没有“丢失”:通过分配给self.my_class_dict,您创建了一个实例属性,它隐藏了具有相同名称的类属性。实例总是在类之前查找实例上的属性,因此会首先找到新创建的变量。

    【讨论】:

    • 感谢您的确认。这正是我所期望的。
    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多