新しいスタイルのクラスのサブクラス化と辞書の更新に関する奇妙な問題を発見しました。
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on
win32
>>> class a(object):
... def __init__(self, props={}):
... self.props = props
...
>>> class b(a):
... def __init__(self, val = None):
... super(b, self).__init__()
... self.props.update({'arg': val})
...
>>> class c(b):
... def __init__(self, val):
... super(c, self).__init__(val)
...
>>> b_inst = b(2)
>>> b_inst.props
{'arg': 2}
>>> c_inst = c(3)
>>> c_inst.props
{'arg': 3}
>>> b_inst.props
{'arg': 3}
>>>
デバッグでは、2 回目の呼び出し ( ) で、コンストラクター内が既に と等しいc(3)
ことがわかります。その後、コンストラクターが呼び出されると、両方のオブジェクトになります。a
self.props
{'arg': 2}
b
{'arg': 3}
また、コンストラクターの呼び出し順序は次のとおりです。
a, b # for b(2)
c, a, b # for c(3)
コンストラクター内で置き換えるself.props.update()
と、すべてが正常になり、期待どおりに動作しますself.props = {'arg': val}
b
しかし、このプロパティを置き換えるのではなく、更新する必要があります。