在python类中创建新的字典变量
如果我创建一个如下所示的类:在python类中创建新的字典变量,python,python-3.x,class,dictionary,initialization,Python,Python 3.x,Class,Dictionary,Initialization,如果我创建一个如下所示的类: 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)
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.foo: {'foo': 'foo2'}
Foo2.bar: bar2
Foo1.foo: {'foo': 'foo2'}
Foo1.bar: bar1
但是,现在如果我创建一个名为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)
我得到输出:
Foo1 = Foo('foo1', 'bar1')
print(Foo1.foo)
print(Foo1.bar)
Foo2.foo: {'foo': 'foo2'}
Foo2.bar: bar2
Foo1.foo: {'foo': 'foo2'}
Foo1.bar: bar1
字符串属性bar
已按预期设置,但字典foo
已针对两个foo实例进行了更新
我可以通过在init魔术方法中将dictfoo
声明为:
class Foo(object):
def __init__(self, foo, bar):
self.foo = {'useful_info': 'useful_info'}
self.foo['foo'] = foo
self.bar = bar
但是现在包含“有用信息”的字典foo
在调用init函数之前是无法访问的,也就是说,如果我使用以下行:foo.foo
我会得到一个AttributeError
有没有办法创建一个包含一些“有用信息”的新词典,以便在初始化类之前可以访问有用信息,并且类的每个新实例都有一个不同的该词典实例。您可以在\uuuuu init\uuuuu
中创建词典的副本,以便每个实例都有该词典的深度副本字典,而不是共享相同的foo
dictionary对象
import copy
class Foo(object):
foo = {'useful_info': 'useful_info'}
def __init__(self, bar):
self.foo = copy.deepcopy(Foo.foo)
self.bar = bar
您可以在\uuuu init\uuuu
中创建字典的深度副本,这样每个实例都有字典的深度副本,而不是共享相同的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 Foo:
foo = {'useful_info': 'useful_info'}
def __init__(self, foo, bar):
self.foo = {'useful_info': 'useful_info'}
self.foo['foo'] = foo
self.bar = bar
谢谢虽然我认为self.foo['foo']]。。。行应替换为self.foo=copy.deepcopy(self.foo),但为什么它们共享相同的
foo
对象?原始问题将参数“foo”设置为dict foo的键“foo”下的值。我知道这可能不是最好的命名系统!要回答这个问题,同时保留原始问题的功能,必须在init中重新创建dict foo,并且在新dict中,应将key foo设置为参数foo。虽然我同意这基本上回答了我的问题。谢谢!虽然我认为self.foo['foo']]。。。行应替换为self.foo=copy.deepcopy(self.foo),但为什么它们共享相同的foo
对象?原始问题将参数“foo”设置为dict foo的键“foo”下的值。我知道这可能不是最好的命名系统!要回答这个问题,同时保留原始问题的功能,必须在init中重新创建dict foo,并且在新dict中,应将key foo设置为参数foo。虽然我同意这一点,但这基本上回答了我的问题。foo['usiver\u info']
不会被调用\uuuu init()\uuuu
覆盖吗?如果在调用之前使用并修改了它,这不是一个问题吗?@AniMir类变量不会被修改,因为在它上面的一行创建了一个同名的实例变量self.foo={'usiver\u info':'usiver\u info'}
调用\uu init()\uu
不会覆盖foo['usiver\u info']
?如果在调用之前使用并修改了它,这不是一个问题吗?@AniMir类变量不会被修改,因为在它上面的一行创建了一个同名的实例变量self.foo={'usiver\u info':'usiver\u info'}