web-dev-qa-db-ja.com

pythonオブジェクトへの属性の追加

それはしばらくの間私を悩ませたものです。なぜできないのですか:

>>> 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!

ここでのルールは何ですか?説明を教えていただけますか?

35
mik01aj

___dict___を持つ任意のオブジェクトに属性を追加できます。

  • たとえば、x = object()にはありません。
  • 文字列やその他の単純な組み込みオブジェクトにもありません。
  • ___slots___を使用するクラスにもありません。
  • classで定義されたクラスには、前のステートメントが適用されない限り、それがあります。

オブジェクトが___slots___を使用している/ ___dict___がない場合、通常はスペースを節約するためです。たとえば、strでは、dictを使用するのはやり過ぎです。非常に短い文字列の膨張量を想像してみてください。

特定のオブジェクトに___dict___があるかどうかをテストする場合は、hasattr(obj, '__dict__')を使用できます。

This も読むのが面白いかもしれません:

組み込み型とそのインスタンス(リスト、タプルなど)などの一部のオブジェクトには、___dict___がありません。したがって、ユーザー定義の属性を設定することはできません。

___dict___、___slots___などを含むPythonのデータモデルに関するもう1つの興味深い記事は、pythonリファレンスからの this です。

53
ThiefMaster