在 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
如果我创建如下所示的 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