互いに継承する既存のクラスがあります...それらには、サブクラスでオーバーライドされている属性が既にあります。オーバーライドするのではなく、ディクショナリ属性を更新したい...以下のコード...</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
これはまったく可能ですか?私がすぐには思いつかない方法でメタクラスを使用するとします。
いくつかのアイデアに基づいてこれを見つけました:
クラス 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
ここで何をしようとしているのか正確にはわかりませんが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
dict 自体を変更すると変更されますB.d
(最初の dict が に渡されChainMap
ます):
>>> dic[6] = 7
>>> B.d
{3: 4, 6: 7}