462
361

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python __init__.pyの書き方

Last updated at Posted at 2018-10-05

Python __init__.pyの書き方

Pythonのパッケージを作るのに欠かせない__init__.py

正直自分にとって面倒でイライラする存在でした。
もしかしたらみんな知っているかもしれないけど、
__init__.py作り方についてご紹介します。


初心者にとって面倒な__init__.py

まず、__init__.pyって何?という話ですよね。

__init__.pyとは
__init__.pyは2つの意味がある
1つはPythonディレクトリを表す役割を担う
1つはモジュールをimportするときの初期化処理を行う

...僕は最初のうち、この説明ではよくわかりませんでした。

やっていけば分かるはずなのでここではこれ以上この説明に突っ込みません。


import ~ と from ~ import ~ の違い

__init__.pyの説明の前にまず、importとfromについての説明を少々。

import

import モジュール名 [as 別名]
あるモジュールの機能を追加する

機能を利用するときは
(モジュール名 もしくは 別名).(機能名)と入力します。

例1
#randomというパッケージをimport
import random

#random内のrandintという関数を使う
A=random.randint(0,100)
print(A)
例2
A=[1,2,3,4,5]

#matplotlib内にあるpyplot.pyをimport
import matplotlib.pyplot as plt

#pyplot.pyのplotという関数を使う
plt.plot(A)
plt.show()

from import

from モジュール名 import 機能名
あるモジュールのある機能を追加する

ある機能のみを追加したいとき、モジュール名を書かずに使うことができます。

A=[1,2,3,4,5]

#matplotlibパッケージ内のpyplot.py内にあるplot関数とshow関数の2つのみをimport
from matplotlib.pyplot import plot,show

plot(A)
show()

この2つはあまり大きな違いはありませんが__init__.pyでは意味が変わります。


__init__.pyの書き方

では、__init__.pyの書き方についてご紹介。
まず、パッケージの例を挙げます。

↓パッケージ“test_imt”の構成

📁test_imt
├──📄__init__.py
├──📄main.py
└──📄sub.py

main.pyの中身
import test_imt.sub as ts
def chkprint2():
 ts.chkprint()
 print("You use main.py!")
sub.pyの中身
def chkprint():
 print("You use sub.py!")

注意ですが、パッケージにするときの同じディレクトリ内のモジュールのimportはパッケージ名から書いた方がいいです。
import (パッケージ名).(モジュール名)


__init__.pyの中身がからのとき

__init__.pyは実は何も書かなくてもいいのです。
ただし、importして関数を使いたい時、多少面倒です。
例えばmain.pychkprint2関数を使いたいときに次のように入力します。

test.py
import test_imt as ti
ti.main.chkprint2()

#結果
#You use sub.py!
#You use main.py!

“main”とモジュール名を間に入れることになります。
それでもいいと言うならいいですが、公開するとき、使う相手はモジュール名を確認しなければならないかもしれません。
ちなみにモジュール名を書かないと次のようになります。

test.py
import test_imt as ti
ti.chkprint2()

#結果
#test.py, line 2, in <module>
#    ti.chkprint2()
#AttributeError: module 'test_imt' has no attribute 'chkprint2'

意味:test_imtにはchkprint2なんて関数は無いよ!


__init__.pyでモジュール名をカット

では、モジュール名をカットする方法は...?
例えばmain.pychkprint2関数をモジュール名をカットして使いたいときには次のようにします。

__init__.pyの中身

__init__.py
from test_imt.main import *

import時

test.py
import test_imt as ti
ti.chkprint2()

#結果
#You use sub.py!
#You use main.py!

ここではfrom ~ import *を利用します。
import ~を利用するとモジュール名をカットして関数を使うと先程のエラーが発生します。
このような性質があるのなら
• モジュール名をカットして使いたいときはfrom ~ import *を使って書く
• ただ単に準備の為に作ったモジュールで、公開するとき必要性が無いものはimport ~を使って書く
と使い分けできます。

例えば、
main.pyの中身を主に使用するならfrom test_imt.main import *と書く。
sub.pyをプログラム内に取り込むだけで主要な関数が無いならimport test_imt.subと書く。

ちなみにiPhone上でPythonができるPythonista3では予測変換があり、さらにsite-package3に自作パッケージを入れて実際にパッケージとしてチェックできます。

あ、あと、__init__.py内で関数を定義できます。__init__.pyで定義した関数はモジュール名を書く必要がないです。


最後まで見てくれて本当にありがとうございます!
もしかしたら、わかりにくかったかもしれません...もしそうだったら、すみませでした...

462
361
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
462
361

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?