過去の日記

2019-03-26 [長年日記]

objectのインスタンスには属性をセットできません [Python]

>>> x = object()

>>> x.foo = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'foo'

'object' object has no attribute 'foo'

なんで? と思った。

例えばobjectを継承しつつも一切なにもしないクラスを作って

>>> class Foo: pass

>>> x = Foo()

>>> x.foo = 1

とするのはなにも問題ない。

なぜobjectに属性を作る機能がないのか?
なぜobjectを継承しつつ特に何も動作を変えないクラスには属性を作る機能があるのか?
などということに長いこと引っかかっていたのだが、ドキュメントを読んでいて見つけてしまった。

注釈
object は __dict__ を 持たない ので、 object クラスのインスタンスに任意の属性を代入することはできません。
https://docs.python.org/ja/3.6/library/functions.html#object

しっかり明記してあった。

考えると、objectはすべてのクラスの親クラスなので、objectが__dict__を持っていたりすると

>>> a = int(100000000)

>>> b = int(100000000)

>>> a is b
False

>>> a.x = 'なんとか'; b.x = 'かんとか'  # これは実際にはエラーになる

だとか

>>> x = 1

>>> x.hoge = 'なんとか'  # これも実際にはエラーになる

だとか、組み込み型のあらゆる値に勝手に属性を差し込めることになってしまうので確かによくなさそう、と考え直したのだった。