【问题标题】:Creating a new dictionary variable in a class python在类python中创建一个新的字典变量
【发布时间】:2020-02-25 13:39:12
【问题描述】:

如果我创建如下类:

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 魔术方法中声明 dict 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。

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

【问题讨论】:

    标签: python python-3.x class dictionary initialization


    【解决方案1】:

    您可以在__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
    

    【讨论】:

    • 谢谢!虽然我认为 self.foo['foo']... 行应该替换为 self.foo = copy.deepcopy(self.foo)
    • 但是,为什么他们共享同一个foo对象?
    • 原始问题将参数 'foo' 设置为 dict foo 的键 'foo' 下的值。我知道这可能不是最好的命名系统!为了在保留原始问题的功能的同时回答这个问题,必须在 init 中重新创建 dict foo,并且在该新 dict 中,键 foo 应设置为参数 foo。虽然我同意这几乎回答了我的问题。
    【解决方案2】:

    只需将两者结合起来:

    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 
    

    【讨论】:

    • foo['useful_info'] 不会被__init()__ 的调用覆盖吗?如果在调用之前使用和修改它,这不是问题吗?
    • @AniMir 类变量不会被修改,因为在它上面的行创建了一个同名的实例变量...self.foo = {'useful_info': 'useful_info'}
    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多