私はPython 2.7のサブクラス化の動作に関する質問があります。dictからサブクラス化した場合、__dict__はいつも空ですか?
組み込みのdict
タイプからサブクラス化すると、__ dict __
は常に空であるようです。 Pythonはキーと値のペアをどこに保存しますか?
私はPython 2.7のサブクラス化の動作に関する質問があります。dictからサブクラス化した場合、__dict__はいつも空ですか?
組み込みのdict
タイプからサブクラス化すると、__ dict __
は常に空であるようです。 Pythonはキーと値のペアをどこに保存しますか?
部分的な答えは、あなたが__dict__
の目的を誤解していることです。 __dict__
はアイテムではなく属性を格納するために使用され、のほとんどのユーザ定義オブジェクトに存在します。実際に、dict
を適切な方法でサブクラス化すると、__dict__
はに値が入ります。
>>> class Foo(dict):
... def __init__(self, *args, **kwargs):
... super(Foo, self).__init__(*args, **kwargs)
... self.banana = 'banana'
... self['banana'] = 'not really a banana'
...
>>> f = Foo()
>>> f.__dict__
{'banana': 'banana'}
>>> f.banana
'banana'
>>> f['banana']
'not really a banana'
dictクラスは純粋にC言語で実装されています。そのデータストレージはその実装にとってプライベートなものです。
思考実験として、名前/値のペアをPythonの辞書に入れると想像してください。別のPython dictで?それで、まあ、あなたはアイデアを得る!
+1データストレージに関する二次質問に答えるためです。 – senderle
のdictオブジェクトは、実際に__dict__
を持っていないのでので、あなたが参照している__dict__
は、あなたのオブジェクトFoobar
にローカル辞書です。 Foobar
には属性がありません。__dict__
は空です。
少なくとも私は1つの投票を得ました。> –
__dict__
は、オブジェクトの属性が格納される場所です。 Dictsのアイテムは属性ではなく、アイテムです。ほとんどの辞書にはデータ属性はありません。
BTW:サブクラス化dict
は、達成しようとしていることに応じて、正しく行うのが難しいです。たとえば、__setitem__
メソッドをオーバーライドできますが、update
メソッドは使用しません。
__dict__
は、属性のためです:
>>> class D(dict):
pass
>>> d=D()
>>> d.__dict__
{}
>>> d.x=5
>>> d.__dict__
{'x': 5}
@Gabe、yeah、ok - edited。 – senderle