假设我有以下类层次结构:
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}
。
答案 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