それはしばらくの間私を悩ませたものです。なぜできないのですか:
>>> a = ""
>>> a.foo = 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'foo'
...私は次のことができますか?
>>> class Bar():
... pass
...
>>> a = Bar()
>>> a.foo = 10 #ok!
ここでのルールは何ですか?説明を教えていただけますか?
___dict__
_を持つ任意のオブジェクトに属性を追加できます。
x = object()
にはありません。__slots__
_を使用するクラスにもありません。class
で定義されたクラスには、前のステートメントが適用されない限り、それがあります。オブジェクトが___slots__
_を使用している/ ___dict__
_がない場合、通常はスペースを節約するためです。たとえば、str
では、dictを使用するのはやり過ぎです。非常に短い文字列の膨張量を想像してみてください。
特定のオブジェクトに___dict__
_があるかどうかをテストする場合は、hasattr(obj, '__dict__')
を使用できます。
This も読むのが面白いかもしれません:
組み込み型とそのインスタンス(リスト、タプルなど)などの一部のオブジェクトには、_
__dict__
_がありません。したがって、ユーザー定義の属性を設定することはできません。
___dict__
_、___slots__
_などを含むPythonのデータモデルに関するもう1つの興味深い記事は、pythonリファレンスからの this です。