在 class python 中创建一个新的字典变量

Creating a new dictionary variable in a class python

如果我创建如下所示的 class:

class Foo(object): 
     foo = {'useful_info': 'useful_info'}  
     def __init__(self, foo, bar): 
         self.foo['foo'] = foo 
         self.bar = bar 

我创建了它的一个实例并将它的属性打印为:

Foo1 = Foo('foo1', 'bar1')
print(Foo1.foo)
print(Foo1.bar)

我得到输出:

Foo1 = Foo('foo1', 'bar1')
print(Foo1.foo)
print(Foo1.bar)

但是,现在如果我创建一个名为 Foo2 的新实例并将 Foo1 和 Foo2 的属性打印为:

Foo2 = Foo('foo2', 'bar2')

print("Foo2.foo: ", Foo2.foo) 
print("Foo2.bar: ", Foo2.bar) 
print("Foo1.foo: ", Foo1.foo) 
print("Foo1.bar: ", Foo1.bar)

我得到输出:

Foo2.foo:  {'foo': 'foo2'}
Foo2.bar:  bar2
Foo1.foo:  {'foo': 'foo2'}
Foo1.bar:  bar1

字符串属性 bar 已按照我的预期设置,但字典 foo 已为 Foo 的两个实例更新。

我可以通过在 init 魔法方法中声明字典 foo 来解决这个问题:

class Foo(object): 
     def __init__(self, foo, bar): 
         self.foo = {'useful_info': 'useful_info'} 
         self.foo['foo'] = foo 
         self.bar = bar 

但现在包含 'useful_info' 的字典 foo 在调用 init 函数之前无法访问,即如果我使用以下行:Foo.foo 我得到一个 AttributeError。

有没有办法创建一个包含一些 'useful_infomation' 的新字典,以便在 class 初始化之前可以访问有用的信息,并且 class 的每个新实例都有一个这本词典的不同实例。

您可以在 __init__ 中创建字典的 copy.deepcopy,这样每个实例都有字典的深层副本,而不是共享相同的 foo 字典对象。

import copy

class Foo(object): 
    foo = {'useful_info': 'useful_info'}  
    def __init__(self, bar): 
        self.foo = copy.deepcopy(Foo.foo)
        self.bar = bar

只需将两者结合起来:

class Foo:
    foo = {'useful_info': 'useful_info'}
    def __init__(self, foo, bar):
        self.foo = {'useful_info': 'useful_info'}
        self.foo['foo'] = foo
        self.bar = bar