Pythonのパッケージ・モジュール・クラスなど関係性


# はじめに
Pythonのパッケージ・モジュール・クラス・インスタンス・メソッド・関数の関係性をまとめました。
TensorFlowという機械学習ライブラリを例として使用しています。

# この記事の対象者
この記事の対象者は以下のような方々です。
・Pythonのパッケージ・モジュール・クラス・インスタンス・メソッド・関数の関係性を確認したい。

### 本記事のおおまかな内容

1. パッケージ・モジュール・クラス・インスタンス・メソッド・関数の関係性

2. パッケージ、モジュール、関数の例

3. クラス、メソッド、インスタンスとは

4. クラス、メソッド、インスタンスの例


# 1. 一般的なソフトウェアライブラリ
ソフトウェアライブラリは以下のような**要素**で構成されています。
**・パッケージ**：異なる"モジュール"が複数集まったコード群を"パッケージ"と言います。
**・モジュール**：.pyファイル（pythonのプログラムコードのこと）で、"クラス"と"関数"などが書かれています。
**・関数**：ある程度の処理をまとめたものです。たとえば、100回足し算する関数や箱の3辺長さから体積を出す関数などです。
**・クラス**："メソッド"を集めてひと固まりのグループにしたものを"クラス"と言います。
**・インスタンス**：クラスに対して、実際に処理する対象を与えたものです。
**・メソッド**："クラス"内で定義された関数のことです。


上記だけを読んでもよく分からないので、下の図と一緒に眺めてください。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/23b8f7db-482d-eca0-ac96-67f6ef162848.png)

抑えるべきは、以下の2点です。
1.普段私たちが階層構造（フォルダの中にフォルダを作ったり）でファイルを管理しやすくしています。同様に、パッケージとモジュールは実際のデータ処理の部分である関数とメソッド（メソッドはクラスとセットになっていますが）を分かりやすく管理している。
2.実際のデータ処理部分は、主に関数やメソッドに記載されている。

## 2. パッケージ、モジュール、関数の例

例として、[TensorFlow](https://www.tensorflow.org/api_docs/python/tf)という機械学習ライブラリのload_dataという関数を階層構造で以下の図に示してみます。左と右の図は同じことを表しています。

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/cf9a0b45-60d6-aa1f-c736-02784c529fe7.png)

上図の(例)を見れば分かる通り、load_dataはtensorflow(パッケージ)の中のkeras(モジュール)の中のdatasets(モジュール)の中のmnist(モジュール)の中の関数となっています。そしてPythonのプログラムコードでは、下の階層に行くことを.(ドット)で示します。

よって、チュートリアルから抜粋した、下記の機械学習のデータセットをロードする部分のコードですが、
まず、mnistという名前に、tensorflow内のkeras内のdatasets内のmnistというモジュールを割り当てています。つまり、新しくmnistという名前を作って、tensorflowの中のmnist(モジュール)を割り当てているのです。
2行目では1行目で作ったmnistに.(ドット)をつけて、さらに下の階層のload_dataという関数を使っているということです。ちなみに()は引数として何も与えず関数を呼びだすことを表しています。

```python:データロードの部分
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
```
ですので上記のコードは下記のコードと全く同じ意味です。
※関数ではこれでOKですが、メソッドで同じように省略をしようとするとエラーとなります。なぜかは、記事の下の方で説明しています。

```python:データロードの部分（mnistの宣言を省略した場合）
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
```

上図で示したようなtensorflow内のモジュールや関数などの構造は下記の公式HPで簡単に調べることができます。
[TensorFlow Core Module: tf.keras.datasets](https://www.tensorflow.org/api_docs/python/tf/keras/datasets)

上のリンクでtf.keras.datasetsのページを開くと、下図のように情報を得ることができます。番号は下図と対応しています。
➀tensorflow全てのパッケージ、モジュールの階層情報が一覧で表示されている。
➁現在開いているtf.keras.datasetsはモジュールであることが示されている。
➂現在開いているtf.keras.datasetsよりも1つ下の階層にはどのようなモジュールがあるか示されています。

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/caeb030f-cc2e-591f-a60c-d0ba974b0fbc.png)



# 3. クラス、メソッド、インスタンスとは
Pythonについて学ぶ上で、強いてはTensorFlowを使いこなす上でクラス、メソッド、インスタンスを知っておく必要があります。プログラムの処理を見やすく管理するという目的では、パッケージ、モジュール、関数だけで十分な気がしますが、クラスはPythonにおけるオブジェクト指向という考え方を実現するために存在しています。
"オブジェクト指向"については、たくさんの記事が書かれているので、ここでは割愛します。本記事では、クラスとメソッドとインスタンスの使い方と関数との違いだけ説明します。

まず、メソッドの役割は関数とほとんど同じで、ある程度の処理をまとめて行うものです。1点だけ大きく違うのは以下の図のように、関数は単体で使われるのに対して、メソッドはクラスとセットで使われます。メソッドを使うには、上図のようにクラスからインスタンスという、メソッドで処理する対象および処理後のデータなどを入れておく箱のようなものを作っておく必要があります。一方で関数は、普通の変数に対して直接処理を実行可能です。

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/284fd3be-5e65-73d0-d48d-27a43ce88b42.png)

コードで書くとこんな感じです。

```python:クラスからインスタンス作成してメソッドを実行
Instance = Class(クラスの引数) # クラスからインスタンスを作成しています。クラスの引数が空()のこともよくあります。 
Instance.method(メソッドの引数) #　作成したインスタンスに対してメソッドの処理を行っています。
```
ですので、メソッドを利用には、（関数とは違い）あらかじめクラスからインスタンスを作成する必要があるので、下記のようなコードはエラーとなります。これが関数との大きな違いです。※特殊なメソッドもありますが、最初は知らなくても大丈夫だと思います。

```python:インスタンスの作成無しでメソッドを実行
Class.method(メソッドの引数) # エラーとなります。
```

# 4. クラス、メソッド、インスタンスの例

例として、TensorFlowのSequentialというクラスとその下の階層のcompile、fit、evaluateというメソッドの構造を以下の図に示します。左と右の図は同じことを表しています。

![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/932a9cd4-6359-270d-01a3-3feb7da60adc.png)

そして、例としてチュートリアルから抜粋した下記データロード部分のコードですが、Sequentialはクラス、compile、fit、evaluateはメソッド、modelはSequentialはインスタンスとなってます。まず、Sequentialというクラスを使ってmodelというインスタンスを作成し、このインスタンスに対してSequentialというクラスの下の階層のcompile(学習方法の定義)、fit(モデル学習)、evaluate(モデル評価)というメソッドの順番に処理をしています。※ちなみに、Sequentialの引数のリスト内のtf.keras.layers.Flattenなどはクラスになっており、機械学習モデルの構造の定義のために使われます。

```python:TensorFlowチュートリアルでのクラスとインスタンスの例
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test,  y_test, verbose=2)
```
tensorflowのクラスとメソッドなどの構造やそれぞれの引数は、関数と同様に下記の公式HPから確認することができます。
[TensorFlow Core Class Method: tf.keras.model.Sequential](https://www.tensorflow.org/api_docs/python/tf/keras/Sequential)

# 終わりに
TensorFlowを例にして、ライブラリについて非常にざっくり整理してみました。Pythonを勉強する上で、少しでもこの記事が助けになればと思います。
※間違ってたら、コメントでご指摘をお願いいたします。

# 参考文献
[TensorFlow](https://www.tensorflow.org/api_docs/python/tf)
[TensorFlow Tutorial](https://www.tensorflow.org/tutorials/quickstart/beginner?hl=ja)
[Python tutorial](https://docs.python.org/ja/3/tutorial/index.html)