過去の日記

2019-03-08

十二人の死にたい子どもたち [novel]

13人いる! (ただ言いたかっただけ)

十二人の死にたい子どもたち

  • 作者: 冲方 丁
  • 出版社/メーカー: 文藝春秋
  • 発売: 2016-10-15
  • ASIN: 4163905413
  • メディア: 単行本
  • amazon.co.jp詳細へ

大変面白かったですが、冲方丁にしては切れ味がするどくはないかなと思った。
オチというトリックというか状況が順当な感じで想像を超えなかったからだけど、それでいい話なのでいいのですが。

(文庫版がない!?)


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 = 'なんとか'  # これも実際にはエラーになる

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