如何在类层次结构上聚合字典(Python)

时间:2010-11-03 05:10:50

标签: python inheritance dictionary

假设我有以下类层次结构:

class A(object):
  _d = {}

class B(A):
  _d = {'b': 1}

class C(A):
  _d = {'b': 2, 'c': 3}

class D(B):
  _d = {'d': 4}

有没有办法在d上编写@property方法A,它会在对象的所有超类上返回聚合字典?例如,B().d将返回{'b': 1}C().d将返回{'b': 2, 'c': 3}D().d将返回{'b': 1, 'd': 4}

3 个答案:

答案 0 :(得分:4)

使用inspect.getmro跳过多重继承的任何问题,并避免递归调用以获取所有子类的必要性。

import inspect

@property
d(self):
    res = {}
    subclasses = inspect.getmro(type(self))
    for cls in reversed(subclasses):
        res.update(gettattr(cls, 'd', {}))
    return res 

答案 1 :(得分:2)

嗯,直截了当的解决方案是使用类的__bases__属性来遍历继承链。但是,有一些多重继承问题可能会或可能不会引起您的关注。

 def d(self):
     res = {}
     def traverse(cls):
         if hasattr(cls, '_d'):
             for k,v in cls._d.iteritems():
                 res[k]=v
             for basecls in cls.__bases__:
                 traverse(basecls)
     for k,v in self._d.iteritems():
         res[k]=v
     traverse(self.__class__)
     return res

>>> D().d()
{'a': 1, 'c': 4, 'b': 2}

答案 2 :(得分:2)

  @property
  def d(self):
    res = dict(self._d)
    for c in self.__class__.__bases__:
        res.update(getattr(c(),'d',{}))
    return res