29

Python のサブクラス化はdict期待どおりに機能します。

>>> class DictSub(dict):
...     def __init__(self):
...         self[1] = 10
...         
>>> DictSub()
{1: 10}

ただし、 a で同じことをしてcollections.OrderedDictもうまくいきません。

>>> import collections
>>> class OrdDictSub(collections.OrderedDict):
...     def __init__(self):
...         self[1] = 10
...         
>>> OrdDictSub()
(…)
AttributeError: 'OrdDictSub' object has no attribute '_OrderedDict__root'

したがって、OrderedDict 実装はプライベート属性を使用して、サブクラスがサブクラスのように動作__rootするのを防ぎます。なんで?OrderedDict からどのように継承できますか?OrdDictSubDictSub

4

2 に答える 2

36

あなたから呼び出す必要がありOrderedDict.__init__ます__init__

class OrdDictSub(collections.OrderedDict):
    def __init__(self):
        super(OrdDictSub, self).__init__()

OrderedDict自分自身を初期化する機会を与えていません。技術的にはdict、完全に初期化された が必要なため、サブクラスに対してもこれを行う必要がありますdict。それがなくても機能するという事実dictは、ただの運です。

于 2012-06-24T03:19:33.083 に答える
2

__init__メソッドでスーパークラスを初期化してみてください。

def __init__(self):
    collections.OrderedDict.__init__(self)
    self[1] = 10

これは、サブクラスを初期化する通常の方法です。通常、スーパークラスのメソッドを呼び出す必要はありません__init__、スーパークラスの実装についての知識がない場合は、実際に を呼び出す必要があります__init__

于 2012-06-24T03:19:22.203 に答える