【问题标题】:Is there any way to create unique dictionary attribute for every instance in python [duplicate]有没有办法为python中的每个实例创建唯一的字典属性[重复]
【发布时间】:2013-02-18 03:37:13
【问题描述】:

使用一个类在字典中创建多个实例,它们的属性不是唯一的。我希望他们每个人都有自己独特的属性。你是怎么做到的?

代码:

class a(object):

    attr_a = {}

    def __init__(self, a={}):

        self.attr_a = a

if __name__ == '__main__':

    b = a()
    c = a()
    b.attr_a['abc'] = 'abc'
    c.attr_a['abc'] = 'def'

    print(b.attr_a)
    print(c.attr_a)

结果:

{'abc': 'def'}
{'abc': 'def'}

想要的结果:

{'abc': 'abc'}
{'abc': 'def'}

【问题讨论】:

  • 你有一个字典而不是一个list,但最终,问题是完全一样的。
  • @mgilson:thx,我知道它在函数级别是如何工作的,但对类级别有疑问

标签: python class dictionary


【解决方案1】:

这里有两个问题:

1) 对于实例级属性,与类级属性相反,不要在类级声明。因此,请删除您班级中的 attr_a = {}

2) 默认值a={} 在类/函数声明时进行评估,而不是在实例创建/函数调用时进行评估,因此您很少应该使用可变对象作为默认值。这会导致使用默认 a 值创建的类的所有实例共享相同的 attr_a 字典。您应该使用 a=None 作为默认值,然后在 __init__ 中实例化它,如下所示:

def __init__(self, a=None):
        self.attr_a = a or {}

【讨论】:

  • 不要使用a or {}。如果有人传入对空字典或任何其他虚假值的引用怎么办?避免懒惰要好得多:self.attr_a = {} if a is None else a。 (并记录 None 是您正在使用的标记值)。
  • @mgilson:thx,有人建议:if not a: a = {}; self.attr_a = {}
  • @mgilson,点赞!
猜你喜欢
  • 1970-01-01
  • 2015-07-19
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多