2.4. 全てはオブジェクト

念のため確認しておくと, さっき私は「Python の関数は属性を持ち, 実行時に利用可能だ」と言いました.

関数は, 他の Python の要素と同じようにオブジェクトなのです.

好きな Python IDE を開いて, 以下のように実行してください.

Example 2.3. buildConnectionString 関数の doc string を取り出す

>>> import odbchelper                              1
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> print odbchelper.buildConnectionString(params) 2
server=mpilgrim;uid=sa;database=master;pwd=secret
>>> print odbchelper.buildConnectionString.__doc__ 3
Build a connection string from a dictionary

Returns string.
1 最初の行は odbchelper プログラムをモジュール -- 対話的に使ったり, もしくはより大きい Python プログラムから持ってきたりするコードの塊 -- としてインポートしています. (複数モジュールの Python プログラムの例は 4 章 で見れます.) 一度モジュールをインポートしてしまえば, その公開されている関数やクラスや属性を参照することができます. モジュールからも他のモジュールの機能にアクセスするために同じことができますし, IDE からも可能です. これは重要なコンセプトであり, これについてはまた後で語ります.
2 インポートしたモジュールで定義された関数を使いたいときは, モジュール名を付ける必要があります. なので単に buildConnectionString と呼ぶことはできず, odbchelper.buildConnectionString と呼ばなくてはいけません. あなたが Java のクラスを使ったことがあれば, これはなんとなく分かるでしょう.
3 普通の関数の呼び出し方をするかわりに, 関数の属性の 1 つ __doc__ を読み取っています.
Note
PythonimportPerlrequire に似ています. Python モジュールを import すれば, その関数に module.function という形式でアクセスできます. Perl モジュールを require すれば, その関数に module::function という形式でアクセスできます.

2.4.1. インポート探索パス

次の話題に行く前に, 簡単にインポート探索パスについて触れておきたいと思います. あなたがあるモジュールをインポートしようとしているときに, Python は様々な場所を見に行っています. 特に, sys.path に定義された全てのディレクトリを見に行きます. これは普通のリストであり, 簡単に内容を見たり, 通常のリストのメソッドで変更することもできます. (リストについてはこの章の後の方でさらに学習します.)

Example 2.4. インポート探索パス

>>> import sys                 1
>>> sys.path                   2
['', '/usr/local/lib/python2.2', '/usr/local/lib/python2.2/plat-linux2', 
'/usr/local/lib/python2.2/lib-dynload', '/usr/local/lib/python2.2/site-packages', 
'/usr/local/lib/python2.2/site-packages/PIL', '/usr/local/lib/python2.2/site-packages/piddle']
>>> sys                        3
<module 'sys' (built-in)>
>>> sys.path.append('/my/new/path') 4
1 sys モジュールをインポートすることで, そのモジュールにある全ての関数や属性を使えるようにしています.
2 sys.path は現在の探索パスのリストです. (OS や Python のバージョンやインストールした場所によって, 結果は異なるかもしれません.) Python はこのディレクトリを (この順番で) 見に行き, インポートしようとしているモジュール名に合致する .py ファイルを探します.
3 実は, 私は嘘をつきました. 現実には状況はもっと込み入っていて, 全てのモジュールが .py ファイルとして保存されているわけではないのです. sys モジュールのようにいくつかのモジュールは「組み込みモジュール」で, they are actually baked right into Python itself. 組み込みモジュールは通常のモジュールと同じように振舞いますが, その Python ソースコードは利用できません. というのも, 組み込みモジュールは Python で書かれていないからです! (sys モジュールは C で書かれています.)
4 ディレクトリ名を sys.path に追加することで, 実行時に Python の探索パスにディレクトリを追加でき, Python はそのディレクトリを, あなたがモジュールをインポートしようとするときはいつも見に行くようになります. この変更は Python が起動してる間ずっと有効です. (append や他のリストのメソッドについては 3 章 でさらに語ります.)

2.4.2. オブジェクトとは何だ?

Python に出てくる全てのものはオブジェクトで, ほとんどのものは属性とメソッドを持っています. 全ての関数は __doc__ というソースコードの doc string を返す組み込みの属性を持ちます. sys モジュールは (他のものと違って) path という属性を持つオブジェクトです. 他も同様です.

それでもまだ疑問は残ります. オブジェクトとは何か? 言語ごとにそれぞれ違った方法で“オブジェクト”を定義しています. ある言語では, 全てのオブジェクトは属性とメソッドを持たなくてはならない, と定義してあったり, また他の言語では, 全てのオブジェクトは継承可能だ, と定義してあったりします. Python での定義はもっと緩いものです. あるオブジェクトは属性もメソッドも持っていません (これについては 3 章 でさらに扱います) し, 全てのオブジェクトが継承可能なわけではありません (これについては 5 章 でわらに扱います). しかし, 変数に割り当てたり関数の引数として渡せるという意味で, 全てのものはオブジェクトなのです (これについては 4 章 でさらに扱います).

とても重要なことなので最初のうちは何度も繰り返し念を押しますが Python に表れる全てのものはオブジェクトです. 文字列はオブジェクトです. リストもオブジェクトです. 関数もオブジェクトです. モジュールでさえもオブジェクトです.

オブジェクトについてさらに知るには