トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

E71:Pythonのパッケージを使ってみる のバックアップ差分(No.1)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
*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」のみインポートされたこと

ってことがわかったりします。

自分が知りたかったことは以上!