0から学ぶ【Python基礎】

Python | クラスの基礎とモジュールのインポートを解説!

前のページ

12章ではPythonにおける『クラス』『インスタンス』『モジュール』『パッケージ』について解説します。

本記事では、「クラスとは何か?」「クラスの使い方」「モジュールとは何か」「パッケージとは何か」、「モジュール・パッケージのインポートと使い方」を扱っています。

本連載講座【Python 基礎編】では、「プログラミング未経験の方」が挫折せずにPythonの基礎を学ぶことができます。

プログラミングを始めて学ぶ方が理解できるよう、丁寧に解説しています。

さらに、学んだ内容を身につけるための演習問題も用意しています。

・Pythonを挫折せずに学習したい

・無料でPythonを確実に習得したい

このような考えを持っている方は、Tech Teacherが運営する【Python 基礎編】を用いて、Pythonの学習をすることをお勧めします!

<目次>

1章:Pythonの特徴・概要
2章:環境構築と基本操作
3章:出力関数print()
4章:数値の型(int、float)と算術演算子
5章:文字列の操作(len・抽出・結合)
6章:真偽値(True・False)・論理演算(AND、OR、NOT)・比較演算子
7章:変数
8章:if文による条件分岐
9章:リストと辞書
10章:for・whileによる繰り返し(ループ)処理
11章:関数の作り方・使い方
12章:クラスとモジュール

クラスの概要

Pythonにおけるクラスは初学者の方にとって少し難しい概念です。

実践を重ねることで初めて理解できることもあると思うので、焦らず少しずつ学習を進めていきましょう。

まずは、具体例を交えてクラスとその他の関連用語について分かりやすく解説していきます。

クラスに関連する用語を紹介

まずは、「クラス」と「クラスに関連する用語」について簡単に紹介します。

クラス

Pythonにおける『クラス』とは、複数のデータ(変数)や処理を1つにまとめたオブジェクトを作成するための設計図のようなものです。

インスタンス

クラス(設計図)を基に作成されるオブジェクト(物)のことを『インスタンス』と呼びます。

1つのクラスから複数のインスタンスを作成でき、それぞれのインスタンスは別のオブジェクトとして扱われます。

インスタンス変数・メソッド

クラスから作成されたインスタンスは、それぞれ複数のデータや処理を持ちます。

インスタンスが持つデータのことを『インスタンス変数』処理のことを『メソッド』と呼びます。

メソッドはインスタンスがもつ関数のようなものです。

Pythonにおけるクラスとその他の用語の関係は以下のようになっています。

クラス 用語

具体例でクラスを理解する

新たな用語がたくさん出てきて混乱していると思うので、具体例を用いて説明します。

例えば、似たような機能や見た目を持つロボットを複数作成したい場合を考えてみましょう。

作成されるロボットは「身長」「体重」を自由に設定でき、「自分の身長と体重を言う」「『こんにちは』と挨拶をする」という2つの機能を持ちます。

このとき、クラス・インスタンス・インスタンス変数・メソッドに該当するものはそれぞれ以下のようになります。

・ロボットの設計図クラス
・ロボット本体インスタンス
・ロボットの身長体重インスタンス変数
・ロボットがもつ機能メソッド

クラス ロボット

異なる身長・体重を持ったロボットを100体作りたいとき、もし設計図(クラス)がなかったら、ほぼオーダーメイドのロボットを100体作る羽目になってしまいます。

しかし、設計図(クラス)を用意して機械(Python)にロボットを作る手順を覚えさせることで、身長・体重を指定するだけで特徴の異なるロボットを大量生産できるようになります。

これがクラスを用いるメリットの一つです。

クラスの説明まとめ

ここまでの説明をまとめておきます。

11章で関数を用いるメリットとして「何度も同じ処理を記述する必要がなくなる」「プログラムが読みやすくなる」「保守がしやすい」ことなどを挙げました。

同じように、複数のデータや処理を一体化したものをいくつも作成することで、多くのメリットを生み出すことができます。

Pythonでは、この『複数のデータや処理を一体化したもの』を作成するためのひな型(設計図)を作る機能として、『クラス』というものが用意されています。

クラスから作成した各オブジェクトのことを『インスタンス』と呼びます。

また、インスタンスがもつデータや処理をそれぞれ『インスタンス変数』『メソッド』と呼びます。

クラスからインスタンスを複数作り、それぞれを別々のオブジェクトとして扱うことで、1つのインスタンスのデータや処理を変更しても他のオブジェクトはその影響を受けにくくなるなどのメリットがあります。

クラスの使い方

では、クラスの具体的な使い方を見てみましょう。

クラスの例①

まずは簡単な例から見ていきます。

以下は、インスタンス変数とメソッドをそれぞれ1つずつ持つインスタンスを作成するクラスです。

今回は簡単のため、インスタンス変数をインスタンス作成の際に指定するのではなく、直接代入して毎回同じ値に設定するようにしています。

class Sample_class:
    
    num = 10
    
    def print_number(self):
        print('インスタンス変数num:{}'.format(self.num))

上の例は、インスタンス変数としてnum(今回は10に固定)を持ち、メソッドとしてprint_numberを持つインスタンスを生成するクラスです。

Pythonにおけるクラスは「class クラス名:」と記述して定義し、内部にインスタンス変数の定義やメソッドを書いていきます。

なお、クラス名は大文字から始めるという慣習があります。

クラス内部で関数と同じように「def メソッド名(引数)」と記述することで、メソッドを定義することができます。

メソッドの第一引数には必ず「self」と書くというルールがあります。『self』インスタンス自身を指し、メソッド内で自身のインスタンス変数などを呼び出すために使います。

今回はメソッドとして「print_number」メソッドが用意されています。これは呼び出されるとインスタンス変数「num」を出力するメソッドです。

では実際に、インスタンスを作成してみましょう。

instance_1 = Sample_class()

上記のように記述することで、インスタンス変数「num」とメソッド「print_number」を持つインスタンス「instance_1」が作成されます。

作成したインスタンス「instance_1」のインスタンス変数とメソッドを呼び出して確認してみましょう。

print(instance_1.num)
instance_1.print_number()
10
インスタンス変数num:10

インスタンス変数は「インスタンス名.インスタンス変数名」と記述すれば呼び出すことができます。

また、メソッドは「インスタンス名.メソッド名(引数)」として呼び出すことができます。メソッドを呼び出すときは、引数に「self」を入れる必要はありません。

今回は「self」以外の引数がないので、「print_number」メソッドを呼び出す際には引数を指定する必要はありません。

一度クラスを書いてしまえば、それを繰り返し利用してインスタンスを複数作成することができます。

instance_2 = Sample_class()
instance_3 = Sample_class()

print(instance_2.num)
print(instance_3.num)
instance_2.print_number()
instance_3.print_number()
10
10
インスタンス変数num:10
インスタンス変数num:10

今回の場合はインスタンス変数が毎回同じ値になるのでインスタンスごとの違いはあまり感じられないと思います。

クラスの例②

もう一つ例を挙げておきます。

以下は、インスタンス変数として「height」「weight」の2つを持ち、メソッドとして「自分の身長と体重を言うメソッド」「『引数として渡した2つの変数の和を計算するメソッド」を持つインスタンスを作成するクラスです。

class Robot:
    
    def __init__(self, height, weight):
        # インスタンスを作るときに引数として渡した値を、インスタンス変数に代入
        self.height = height
        self.weight = weight
        
    def show_height_weight(self):
        print('私の身長は{}cm、体重は{}cmです。'.format(self.height, self.weight))
    
    def add(self, a, b):
        s = a + b
        print('{}と{}の和は{}です。'.format(a, b, s))

クラス内の一番最初に書いてある「__init(self)__」『コンストラクタ』と呼ばれる特別なメソッドで、インスタンスを作成すると同時に一度だけ呼び出されます。

コンストラクタはインスタンス変数を初期化するために用いられます。

コンストラクタの引数として「self」以外のもの設定することでインスタンスを作成する際にコンストラクタに引数を与えることができるようになります。

では、インスタンスを作成してそれぞれのメソッドを呼び出してみましょう。

# コンストラクタにself以外の引数があるので、インスタンスを作るときに引数を渡す必要がある。
robot_1 = Robot(160, 100)
robot_2 = Robot(30, 20)

robot_1.show_height_weight()
robot_2.show_height_weight()

robot_1.add(10, 20)
robot_2.add(1, 1728)
私の身長は160cm、体重は100cmです。
私の身長は30cm、体重は20cmです。
10と20の和は30です。
1と1728の和は1729です。

引数として渡した身長と体重がそれぞれのインスタンスに反映されていることが分かります。

このようにして、一つのクラス(ひな型)から、異なるインスタンス変数を持った複数のインスタンスを作成することができます。

また、インスタンス変数に新たな値を代入して更新することもできます。

print(robot_1.height)

robot_1.height = 130
print(robot_1.height)
160
130

クラス使用時のポイントまとめ

クラスを使用する際のポイントをまとめておきます。

インスタンス変数へのアクセス→「インスタンス名.インスタンス変数名」

メソッドの呼び出し→「インスタンス名.メソッド名(引数)」

クラス名大文字から始める

・メソッドを定義するとき、第一引数は必ず「self」にする

・インスタンス作成時に、コンストラクタ(__init__)に対する引数を与えることができる

モジュールとは?パッケージとは?

ここでは、Pythonで統計解析やデータサイエンスを行う際に必要な『モジュール』『パッケージ』やその導入方法について解説します。

モジュールとパッケージ

Pythonにおいて『モジュール』とは、Pythonのコードをまとめたファイル(.pyファイル)のことを指します。

1つのモジュールの中には複数の関数やクラスなどが記述されており、使用者はモジュールをインポートするだけで便利な機能を簡単に実装することができます。

また、複数のモジュールをまとめて一つのディレクトリ(フォルダ)にまとめたもの『パッケージ』と呼びます。

『NumPy』『Pandas』『Matplotlib』『scikit-learn』などが統計解析やデータサイエンスで使われるモジュールやパッケージの代表例です。

モジュール・パッケージのインポート

Pythonでモジュールやパッケージを使用するには、まずそれらをインポートする必要があります。

モジュールやパッケージは、『import文』を用いてインポートします。

例として、sinやcosなどの数学的な計算を行うのに便利な『math』モジュールをインポートして、実際に使ってみましょう。

mathモジュールはPythonの標準ライブラリなので、外部からパッケージをインストールしなくても、インポートするだけで使用することができます。

import math

# sin, cos
x1 = math.sin(0)
x2 = math.cos(0)
print(x1)
print(x2)

# ルート
y = math.sqrt(9)
print(y)
0.0
1.0
3.0

モジュールは「import モジュール名」と記述することでインポートできます。

モジュールに含まれる関数などを使用する場合は、「モジュール名.関数名」と記述します。

特定の変数や関数のみをインポートする

『from』を用いることで、モジュールやパッケージから特定の変数や関数のみをインポートすることができます。

以下の例では、mathモジュールからsin関数のみをインポートしています。

from math import sin

# 特定の関数などをインポートした場合、モジュール名を省略できる
x = sin(0)
print(x)

pi = math.pi
print(sin(pi/4))
0.0
0.7071067811865476

この場合は、モジュール名のmathを省略してsin()と書くだけでsin関数を用いることができます。

モジュールやパッケージに別名をつける

『as』を用いることで、モジュールやパッケージをインポートするときに、別名を付けることができます。

以下の例では、numpyをインポートするときにnpという別名をつけて使用しています。

import numpy as np

x = np.log(1)
print(x)
0.0

12章の練習問題

以下の練習問題を解いてみましょう。

練習問題

問1. 以下の条件を満たすクラスを作成し、実際にインスタンスを作成してインスタンス変数メソッドを確認してください。

クラス名:Practice_class
インスタンス変数:2つの数値「num1」「num2」をインスタンス作成時に引数として渡し、コンストラクタ内でインスタンス変数として定義
コンストラクタ:インスタンス変数「num1」「num2」に、引数で与えられた数値を代入
メソッド:「num1」「num2」の乗算の結果を出力するcalc_productメソッド

問2. mathモジュールの関数を利用して、以下の問いに答えてください。

(1) 引数として半径が与えられたとき、円の面積を計算して戻り値として返す関数calc_circle_areaを作成してください。
(2) 2つの引数として長方形の幅と高さが与えられたとき、対角線の長さを計算して戻り値として返す関数calc_diagonal_lengthを作成してください。

解答

問1(クリックして解答を表示)

# クラスの定義
class Practice_class:
    
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2
        
    def calc_product(self):
        print('num1 * num2 = {}'.format(self.num1 * self.num2))

# インスタンスの作成
instance = Practice_class(2, 5)

# インスタンス変数・メソッドの確認
print(instance.num1)
print(instance.num2)
instance.calc_product()
2
5
num1 * num2 = 10

問2(クリックして解答を表示)

(1)

import math

def calc_circle_area(radius):
    area = math.pi * radius**2
    return area

# 使用例
radius = 5
area = calc_circle_area(radius)
print('半径 {} の円の面積は {} です。'.format(radius, area))
半径 5 の円の面積は 78.53981633974483 です。

(2)

import math

def calc_diagonal_length(width, height):
    diagonal_length = math.sqrt(width**2 + height**2)
    return diagonal_length

# 使用例
width = 4
height = 3
diagonal_length = calc_diagonal_length(width, height)
print('幅が {} で高さが {} の長方形の対角線の長さは {} です。'.format(width, height, diagonal_length))
幅が 4 で高さが 3 の長方形の対角線の長さは 5.0 です。