- 2010年9月29日 12:00 AM
- Python

“初めてのPython“も佳境ですね。
あと2部読み進めればおしまいです。
“初めてのPython“を全て読むことが出来れば、Pythonistaとしての第一歩を踏み出せたことになります(自分の中で)。
初めてのPython V部
“初めてのPython“のV部は、”モジュール“に関してまとられています。
Pythonにおけるモジュールのインポートの仕方や、再読み込み、その扱いまで。
と、”その前にモジュールって何?“という方のためにWikipediaから引用しておきます。
プログラミングにおいて、一連の機能をひとまとまりになる複数の機能:モジュールに分割し、それぞれ別に開発する場合がある。こうすることで、全体として完成を早めることが出来る上、モジュール単位でテストしたりすることが可能になり、モジュールの入れ替えで機能を高めたり補修したりすることができるようになる。
モジュール – Wikipediaより
そして、モジュールとクラスの違いは、以下の通り。
ジュールとクラスの違いは以下の通りである。
クラスにはインスタンスとしてオブジェクトを生成する機能がある。
クラスは他のクラスの動作やデータを継承することができる。
ポリモーフィズムにより、クラスのインスタンス間の関係は実行時に変化するが、モジュール間の関係は静的である。
モジュールとクラスの類似点は以下の通りである。
どちらも実装の詳細を外部から隠蔽する。
どちらも階層(モジュール階層とクラス階層)を形成することができる。
モジュール – Wikipediaより
普段、PHPを使っているのでこの”モジュール“という概念が頭にありませんでした。
PHPではインポート(require)すると、C言語のインポート(include)と同じで、”ファイル自体がそこに読み込まれる“という動作をしますからね。
インポートだけでは、名前空間が別に分かれたりしないわけです。
こういう構造もあってか、PHPではモジュールをすっ飛ばしてクラスを使います。
そのため、私自身、”モジュール“は初体験でした。
このあたりの話になってくると、色々と絡み合ってくるので、読むのに苦労しました。
最後の応用の部分は理解出来たか、自身がありませんが、基本は押さえたので、これをまとめていきます。
モジュール
Pythonにおける”モジュール”とは、
ファイル
です。
これが一番分かりやすいでしょう。”モジュール” = “ファイル“なのです。
以前の記事を覚えているでしょうか?
この記事からスコープの画像を引用します。

このファイルにあたる部分が、Pythonでは”モジュール“と呼ばれます。
この図から分かる通り、Pythonではファイル間でスコープを共有しません。
そのため、ファイルごとに機能を独立してコードを記述することが出来るのです。
機能を独立して記述できる…だから、Pythonではファイルが”モジュール“なのです。
Pythonではこの”モジュール”も”オブジェクト“として扱います。
モジュールを読み込むためにはimportステートメントを使います。
オブジェクトである証拠をソースコードで示しましょう。
ファイル構造は次の図の通りとします。

これらのファイルの中身は次のソースコードとします。
spammer.py
import spam print spam.x
spam.py
x = 20
egg.py
import spam spam.x = 10 import spamer
egg.pyを実行した結果として出力されるのは”20“ではなく、”10“です。
モジュールがオブジェクトとして扱われるために、このような動作となります。
今までの”可変性/不変性“や”リファレンス“の考え方を理解していれば、この動作はしっくり来ます。
importステートメントは“モジュールオブジェクト”へのリファレンスを作り出す操作なのです。
また、説明していませんが、モジュール内の変数へはドット(.)を使って自由にアクセス出来ます。
モジュール内にある変数を呼び出すときは、
[モジュール名].[変数名]
関数を呼び出すときは、
[モジュール名].[関数名](引数)
という形を取ります。
クラスと同じような使い方なので、オブジェクト指向プログラミングをした人にとっては理解しやすいかと。
“モジュール = ファイル”
分かりやすいし、書きやすいと思いませんか?
import
先ほど説明した通り、importステートメントは、”モジュールオブジェクトへのリファレンス“を作り出します。
1度目のimportステートメントは“モジュールオブジェクト”を生成し、そのリファレンスを設定します。
2度目以降のimportステートメントは生成済みの”モジュールオブジェクト”へのリファレンスを設定します。
spam.py
x = 30
egg.py
import spam spam.x = 10 # spamモジュールをsecond_spamという名前でインポートする import spam as second_spam print second_spam.x
egg.pyを実行した結果は”10“です。
モジュール内の変数が上書きされてしまっていることが分かります。
importステートメントで設定した変数はあくまで、”モジュールオブジェクトへのリファレンス“にしか過ぎません。

importの基本はこれだけです(多分)。
from
fromはimportの拡張です。
spam.py
x = 10
egg.py
from spam import x print x
これだけです。
え、わからない?
モジュールの中の”変数”や”関数”を指定して、読み込んでいるんです。
importステートメントはモジュールをまるごと”オブジェクト”として読み込む方法でした。
fromステートメントは、そのオブジェクト内にあるオブジェクトへのリファレンスを、インポート元のスコープに設定します。

このため、先ほどのimportと同じようなコードを書いても、同じ結果にはなりません(変数が上書きされてしまうからね)。
spam.py
x = 30
egg.py
from spam import x x = 10 # eggモジュールのxオブジェクトをyという名前でコピーする from spam import x as y print y # 30が表示される
しかし、可変性のオブジェクトだと話は別です。
こんなことが出来ます。
spam.py
x = []
egg.py
from spam import x x.append(1) # eggモジュールのxオブジェクトをyという名前でコピーする from spam import x as y print y # [1]が表示される
どうでしょう。
なぜこうなるか、わかりますか?
説明するのが難しいですね…これまた、”オブジェクト“と”リファレンス“の関係です。
“理解出来ない“という方は前の記事を読んでみてください。
reload
個人的に面白い使い方が出来そうと思ったのが”reload“です。
名前の通り、モジュールを再読み込みします。
先ほど、importは”1度目の呼び出し時だけオブジェクトを生成する“と説明しました。
これは、”1度目の呼び出し時だけソースコードをコンパイルしてオブジェクト化する“ことを示します。
つまり、ソースコードはimportを使う限り、1度だけしか読み込まれないんです。
これを2度、3度と読み込むのが”reload“です。
例えばこんなコードを書いてみます。
spam.py
print 'spam'
egg.py
import time import spam while 1: reload(spam) time.sleep(5)
egg.pyを実行すると、5秒おきにspam.pyを読み込みます。
放っておくと、永遠と”spam”と言い続けるでしょう。
これをターミナルで実行した上で(プログラムを強制終了させずに)、spam.pyを書き換えます。
spam.py
print 'spam and egg'
あら不思議、”spam and egg”を連呼するようになりました(うるさいのは変わりないですけどね)。
この”reload“、使い道を間違えなければ強力な武器になりそうです。
プログラムを止めずに、モジュールを差し替えることが出来るんですから。
モジュールについて簡単にまとめてみました。
実はまだたくさん書いていないことがあります。
例えば、モジュール内の変数の隠蔽やモジュールの自己診断、パッケージのインポートなどです。
“初めてのPython“のV部は”簡単なのに、難しい“です。
このあたりは理解よりも、慣れが大きいんでしょうね。
あぁ、Pythonでプログラムが書きたくなってきた!
![]() |
初めてのPython
|
こちらもあわせてどうぞ
- 初めてのPython(4) 関数でさえオブジェクトであるPython
- 初めてのPython(2) ビルトインオブジェクトのまとめ
- 初めてのPython(3) ここが違うぞ、Pythonさん
- 初めてのPython(1) 基礎知識のまとめ
ちょっと一言
PHP Matsuriの準備も進めて行きましょうか。
最近はPythonの勉強ばかりだったので...PHPのほうも頑張りましょうかw
-
http://topsy.com/1-byte.jp/2010/09/29/learning_python5/?utm_source=pingback&utm_campaign=L2 Tweets that mention 初めてのPython(5) importとfromとreloadでモジュールを使いこなす — Topsy.com


