Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python类中创建新的字典变量_Python_Python 3.x_Class_Dictionary_Initialization - Fatal编程技术网

在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魔术方法中将dict
foo
声明为:

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'}