*E71:Pythonのパッケージを使ってみる [#q89e52dd]
個人的開発中のソースが大きくなってきたので、Pythonのパッケージを使ってみます。
さすがに、たいした規模じゃなくても、E71で100行を超えるソースを編集するのが辛くなってきたので、パッケージを使ってソース分割したいわけです。
***Pythonのパッケージ [#x9b6ad9e]
Pythonでは、モジュールを格納するディレクトリに「__init__.py」というファイルを置くことで、そのディレクトリをパッケージとして扱えるようになります。
「__init__.py」は、そのパッケージ内のモジュールがインポートされる際に実行されるスクリプトになります。
「__init__.py」の中身は、何もなければ空でいいみたいです。書く場合にはパッケージの初期化コードや、from package import *のときにインポートされるパッケージを指定する「__all__」を設定するみたいです。
詳しくはリファレンスマニュアルのチュートリアル6.4を参照されたし。
-http://www.python.jp/doc/2.4/tut/node8.html
***実際に使ってみる [#xdeb266a]
今回の例では、以下のようなパッケージ構成を作ります。
┣packageuse1.py パッケージを利用するためのスクリプト
┗testpackage : パッケージディレクトリ
┣__init__.py : パッケージの初期化スクリプト
┣test1.py : パッケージに含むモジュール
┗test2.py : パッケージに含むモジュール
「testpackage」というパッケージの中に、「test1」、「test2」というモジュールが入っている構成です。
test0.py、__init__.py、test1.py、test2.pyは以下のとおり
■packageuse1.py
from testpackage import *
print dir()
if __name__ == '__main__':
test1.TestClass1().printtest()
■__init__.py
print '__init__.py was executed'
__all__ = ['test1']
■test1.py
class TestClass1:
def __init__(self):
print 'TestClass1 Created!'
def printtest(self):
print 'TestClass1 method was executed'
■test2.py
class TestClass2:
def __init__(self):
print 'TestClass2 Created!'
def printtest(self):
print 'TestClass2 method was executed'
まあ、内容は造作もないですな~
この構成で、test0.pyを実行すると、以下のような結果が得られます。
__init__.py was executed
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__warningregistry__', 'pyscripter', 'test1']
TestClass1 Created!
TestClass1 method was executed
実行結果より、
+パッケージの中のモジュールを使う前に、__init__.pyの中が実行されていること
+「__init__.py」の「__ALL__」を設定したことで、「import *」と指定したが、実際にインポートされたのは「test1」のみインポートされたこと
ってことがわかったりします。
自分が知りたかったことは以上!