オブジェクト
- クラスを作る?
- pythonでは、すべてがオブジェクト
- すべてのクラスは、objectクラスを大元とした継承構成になっている
- と書いたけれど、これはpython3.xが目指していること。python2.xではこの辺りが少しファジーな模様
- まず、「すべてがobject」を貫徹した系を説明して
- そのあとで、それが貫徹されていないがために生じるもろもろを書くことにする
- 「すべてがobject」なpythonの世界
- クラスと型(タイプ)がある
- インスタンスもある
- はじめにobjectクラスとtypeクラスがある
- すべてのクラスは継承元を持ち、objectクラスの継承元は、「()空」であり、typeクラスのそれは「(object,)」となる
- 継承元は object.__bases__ , type.__bases__ , FooClass.__bases__ のようにして確認することができる
- すべてのクラスは継承元を持つが、そのほかに、クラスがオブジェクトであるが故に、そのオブジェクトの「型(タイプ)」も持つ
- objectクラスの「型」はtypeである。これはtypeというクラス(オブジェクトでもある)をobjectクラスの「型」として持たせる、と言う仕組みである
- typeクラスの継承元クラスはobjectクラスである。そしてその型は自身であるtypeである
- クラスを新たに作ることにする。継承元のデフォルトはobjectクラス(これがpython3.xの仕様。ここがきちんとしていないのがpython2.xの仕様)。型はtypeになる
- 基本的なクラス(int, listなど)はobjectクラスを継承元として作られ、型はtypeとして作られている
- クラスにも型があり、クラスのインスタンスとして作成したオブジェクトにも型がある。それはtype(hoge)として表示させることができる
- クラスFooを作成し、そのインスタンスとして発生させたオブジェクトのtypeは__main__.Fooとなる。この表現を見ることで、Fooクラスのインスタンスであることが解る
- 「すべてがobjectとは限らない」なpythonの世界
- python2.xではobjectクラスが根っことは限らない
- したがって、objectクラス(やそれに階層付くクラス)を継承せずにクラスを作ることもできる
- そのようにして作成したクラスの型はtypeではなくclassobjとなり、そのクラスのインスタンスの型はinstanceになる
- このclassobjやinstanceについて型をtype()で尋ねても、呼び出せない
- クラスの構造とは別に def を使って「裸の関数」を作ることもできる
- この関数の型はfunctionである
- 「すべてがobject」な世界なら、このfunctionの型はなに?というたどり方もできそうだが、このfunctionはfunctionであって、型はtype()関数で呼び出せない。classobjやinstanceが「もの」としてはpython(2.x)の中で定義はされていても、「すべてがobject」な世界のはずれものであることが感じ取れる
- こうして見てくると、pythonは3.xに完全準拠しなくても何とかなるが、クラスの定義にあたってはobjectを継承して作成し、その中の書き方は、上流の記法 __init__とかを使うことになる(それが適切である)ことがわかる
- 記法についてはそれを習うべし
- 以下は参考記事
- 参考1(階層ツリー)
- objectとtype
- 型チェック、インスタンスチェック
- 関数の特殊性