-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

これはまったく可能ですか?私がすぐには思いつかない方法でメタクラスを使用するとします。

4

3 に答える 3

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
于 2013-09-27T12:12:11.200 に答える
0

ここで何をしようとしているのか正確にはわかりませんが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}
于 2013-09-26T16:14:11.017 に答える