0

組み込みdictクラスから継承するクラスがあります。以前は次のように見えていました。

class AwesomeDictionary(dict):
    def __init__(self, *args, **args):
        self['hello'] = 'world'
        i = {}
        dict.__init__(i, *args, **kargs)
        self.update(i)

__init__まったく新しい辞書を作成するか、少なくともそれをクリアすると思ったので、一時的な辞書でそのように実装しました。

私はつい最近、Python インタープリターで問題なく次のようなことができることに気付きました。

f = {'hi':56, '67':89}
dict.__init__(f, **{'h':67})
print f
#You get:  {'67': 89, 'h': 67, 'hi': 56}

同じフィールドを指定した場合:

f = {'hi':56, '67':89}
dict.__init__(f, **{'hi':34})
print f
#You get:  {'67': 89, 'hi': 34}

したがって、その場合、 は__init__と同じように動作しているように見え.updateます。

これが当てはまる特定の理由はありますか?実装とバージョン間でこれが一貫していると期待できますか?

.update同様に、おそらくコードの明快さと読みやすさ以外に、通常の辞書を呼び出す目的はありますか?

ああ、私はそれをそのままにして安心のために更新を行うことができることを知っていますが、同じことを2回行うと非常に効率が悪いと感じます.

これがばかげた質問である場合は、申し訳ありません。

御時間ありがとうございます。

4

1 に答える 1

3

を呼び出すこともできますf.__init__(hi=34)

__init__オブジェクトのメソッドは初期化子です。新しく作成されたオブジェクトを初期化するために呼び出され、通常、このメソッドは、実行時にオブジェクトがまだ新鮮で空であると想定します__init__

後でもう一度呼び出す場合、機能するかどうかはクラスによって異なります。dictどうやらうまくいくからです。これがバージョン間で機能することは期待できませんdict.__init__。観察したメソッドの動作はドキュメントで指定されていません。CPython では、 (Cで__init__はありますが) として実装されています。self.update()

最大の欠点は、コードを理解しようとする人を混乱させることです。なぜそんなに明確な__init__ときにいつ電話するのですか?.update()

于 2013-04-02T16:22:25.397 に答える