なぜ組み込みクラスでは機能しませんか?python:組み込みクラスに属性を動的に追加する
サブクラスを使用して解決するのが最善の方法ですか、いくつかの隠された問題にぶつかりますか?
a = {}
a.p = 1 # raises AttributeError
class B(dict):
pass
b = B()
b.p = 1 # works
EDIT:それはb
のために動作しないというのが私の元のコメントは、(私はミスを犯した)間違っていました。
なぜ組み込みクラスでは機能しませんか?python:組み込みクラスに属性を動的に追加する
サブクラスを使用して解決するのが最善の方法ですか、いくつかの隠された問題にぶつかりますか?
a = {}
a.p = 1 # raises AttributeError
class B(dict):
pass
b = B()
b.p = 1 # works
EDIT:それはb
のために動作しないというのが私の元のコメントは、(私はミスを犯した)間違っていました。
組み込みクラスが任意の属性を持っている能力を持っていません。これはパフォーマンス、特にメモリ使用の理由から、list
やdict
のようなビルトインクラスを可能な限り小さくしたいので、それらの多くを持つことができます。
したがって、組み込みクラスには、任意の属性を機能させるために必要な辞書__dict__
はありません。
あなたのクラスにも同じことができます。 C言語で記述されている場合は、単に__dict__
のサポートを実装しないでください。それらがPythonで書かれている場合はslotsを使用します。
dict
をサブクラス化する場合は、いつでもUserDict
(here the documentation)を使用できます。
そして、それはあなたが何をしようとしてで動作します:
from collections import UserDict
a = UserDict()
a.p = 10 # works fine
短い遅延応答: '__slots__'; 'dict'もC言語で実装されており、あなたはそれを継承しています。 – Daenyth
あなたはどのpythonバージョンを使用していますか? b.p = 1は、2.7.2と3.2の両方で動作します。 – soulcheck
ごめんなさい、bの場合はうまくいきます。これを反映する質問が更新されました。 – max