子类中的字典用于更新父类中定义的具有相同名称的字典,而不是覆盖

时间:2013-09-26 15:59:27

标签: python

我有彼此继承的现有类......它们已经有了一个在子类中被覆盖的属性。我希望更新字典属性而不是覆盖...下面的代码...

class A:
  d = {1:2}

class B(A):
  d = {3:4}


b=B()

print b.d[1]
2
print b.d[3]
4

这有可能吗?比如以一种我无法想到的方式使用元类。

3 个答案:

答案 0 :(得分:1)

class A(object):
    d = {1:2}

class B(A):
    d = {3:4}
    def __init__(self):
        dtemp = self.d
        self.d = A.d.copy()     # warning: shallow
        self.d.update(dtemp)

b=B()
print b.d[1]
# 2
print b.d[3]
# 4
a=A()
print a.d[1]
# 2
print a.d[3]
# KeyError

答案 1 :(得分:0)

不知道你到底想要做什么,但如果你在py3.3 +上,collections.ChainMap看起来可能会派上用场:

from collections import ChainMap
...
dic = ChainMap(B.d, A.d)

<强>演示:

>>> dic[1]
2
>>> dic[3]
4

A.dB.d所做的任何修改都会反映在dic

>>> A.d[4] = 5
>>> dic[4]
5

修改dict本身会修改B.d(第一个dict传递给ChainMap):

>>> dic[6] = 7
>>> B.d
{3: 4, 6: 7}

答案 2 :(得分:0)

基于以下的一些想法找到了这个:

B类(A):     _d = {}

def __init__(self):
    for parent_klass in inspect.getmro(self.__class__):
        _d.update(getattr(parent_klass, 'd', {}))
    _d.update(self.d)
    self.d = _d