1

テスト目的で動的属性の割り当てを試していたところ、次の動作が見つかりました。

>>> class Foo(object): pass
... 
>>> bar = Spam()
>>> bar.a = 1
>>> spam = object()
>>> spam.a = 2
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'object' object has no attribute 'a'

派生クラスが正当な最初のバージョンであるのに、そうでない2番目の直接使用はobjectなぜですか?変数の代入の処理方法に明らかに関係するものを導出しても何も変更されていないので、私には少し奇妙に思えます。

4

2 に答える 2

2

これobjectは、がネイティブタイプであるためです。つまり、パフォーマンス上の理由から、Cコードで実装され、動的な属性の割り当てをサポートしていません。strまたはなど、ほとんどのPythonネイティブクラスについても同じことが言えますint

ただし、Pythonでは任意のネイティブ型をサブクラス化でき、サブクラスは動的割り当てをサポートします。

__slots__特別な属性を使用して、クラスのパフォーマンス上の理由から無効にすることもできます。

于 2013-03-08T23:18:13.053 に答える
1

objectインスタンスには。がありません__dict__

>>> hasattr(object(), '__dict__')
False

したがって、属性を追加することはできません。

于 2013-03-08T23:17:37.827 に答える