2012-01-12 32 views
0

なぜ組み込みクラスでは機能しませんか?python:組み込みクラスに属性を動的に追加する

サブクラスを使用して解決するのが最善の方法ですか、いくつかの隠された問題にぶつかりますか?

a = {} 
a.p = 1 # raises AttributeError 
class B(dict): 
    pass 
b = B() 
b.p = 1 # works 

EDIT:それはbのために動作しないというのが私の元のコメントは、(私はミスを犯した)間違っていました。

+0

短い遅延応答: '__slots__'; 'dict'もC言語で実装されており、あなたはそれを継承しています。 – Daenyth

+3

あなたはどのpythonバージョンを使用していますか? b.p = 1は、2.7.2と3.2の両方で動作します。 – soulcheck

+0

ごめんなさい、bの場合はうまくいきます。これを反映する質問が更新されました。 – max

答えて

4

組み込みクラスが任意の属性を持っている能力を持っていません。これはパフォーマンス、特にメモリ使用の理由から、listdictのようなビルトインクラスを可能な限り小さくしたいので、それらの多くを持つことができます。

したがって、組み込みクラスには、任意の属性を機能させるために必要な辞書__dict__はありません。

あなたのクラスにも同じことができます。 C言語で記述されている場合は、単に__dict__のサポートを実装しないでください。それらがPythonで書かれている場合はslotsを使用します。

0

dictをサブクラス化する場合は、いつでもUserDicthere the documentation)を使用できます。

そして、それはあなたが何をしようとしてで動作します:

from collections import UserDict 

a = UserDict() 
a.p = 10 # works fine 
関連する問題