トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

E71:Pythonのパッケージを使ってみる

Last-modified: 2013-08-24 (土) 02:14:21 (3387d)
Top / E71:Pythonのパッケージを使ってみる

E71:Pythonのパッケージを使ってみる

個人的開発中のソースが大きくなってきたので、Pythonのパッケージを使ってみます。

さすがに、たいした規模じゃなくても、E71で100行を超えるソースを編集するのが辛くなってきたので、パッケージを使ってソース分割したいわけです。

Pythonのパッケージ

Pythonでは、モジュールを格納するディレクトリに「__init__.py」というファイルを置くことで、そのディレクトリをパッケージとして扱えるようになります。

「__init__.py」は、そのパッケージ内のモジュールがインポートされる際に実行されるスクリプトになります。

「__init__.py」の中身は、何もなければ空でいいみたいです。書く場合にはパッケージの初期化コードや、from package import *のときにインポートされるパッケージを指定する「__all__」を設定するみたいです。

詳しくはリファレンスマニュアルのチュートリアル6.4を参照されたし。

実際に使ってみる

今回の例では、以下のようなパッケージ構成を作ります。

┣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

実行結果より、

  1. パッケージの中のモジュールを使う前に、__init__.pyの中が実行されていること
  2. 「__init__.py」の「__ALL__」を設定したことで、「import *」と指定したが、実際にインポートされたのは「test1」のみインポートされたこと

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

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

リンク