我有相互继承的现有类……它们已经有一个在子类中被覆盖的属性。我希望更新字典属性而不是覆盖...下面的代码...</p>
class A:
d = {1:2}
class B(A):
d = {3:4}
b=B()
print b.d[1]
2
print b.d[3]
4
这可能吗?说以我无法想到的方式使用元类。
我有相互继承的现有类……它们已经有一个在子类中被覆盖的属性。我希望更新字典属性而不是覆盖...下面的代码...</p>
class A:
d = {1:2}
class B(A):
d = {3:4}
b=B()
print b.d[1]
2
print b.d[3]
4
这可能吗?说以我无法想到的方式使用元类。
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
不知道你到底想在这里做什么,但collections.ChainMap
如果你在 py3.3+ 上看起来可能会派上用场:
from collections import ChainMap
...
dic = ChainMap(B.d, A.d)
演示:
>>> dic[1]
2
>>> dic[3]
4
对任何一个A.d
或B.d
将反映在dic
>>> A.d[4] = 5
>>> dic[4]
5
修改字典本身会修改B.d
(第一个字典传递给ChainMap
):
>>> dic[6] = 7
>>> B.d
{3: 4, 6: 7}
根据周围的一些想法找到了这个:
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