【入門者向け】Pythonのクラスを習得する方法を詳しく解説!
- 公開日: 2018年6月14日
クラス(class)、パワフルな機能であることは分かっているものの、難しい。
参考書のコピペは動くが、GitHubなどの実務レベルになると意味不明。
「クラス、オブジェクト指向、キライっ!」とならないように、今回はPythonのクラスをやさしく解説します。
難しい機能は後にして、とりあえずクラスと仲良くなりませんか?
- 【必要な事前知識】
関数、変数、モジュール、オブジェクト指向の考え方
【Python入門】Pythonのクラスを習得していこう
Pythonのクラスとは
Pythonでオブジェクト指向を適用する場合もクラス(class)機能を使います。 Pythonには、 def を使ったモジュール機能もありますが、それに比べて class はワンランク上の機能。
モジュール | クラス |
---|---|
別のPythonファイルから機能(モジュール)を取り込む 定められた処理機能をこなす 処理機能の設定変更は外部から不可 | 別のPythonファイルからクラスを取り込み 処理機能を操作できる 処理機能の設定変更は外部からでも可能 |
<< コードの比較 >>
■モジュールのコード■
■クラスのコード■
このモジュールとクラスの違いとしては、冒頭の from ●● import ●● の宣言文で使える範囲が違うということです。 モジュールの場合も、
from ●● import ●●
from ●● import ●●
・・・
と繰り返せばいいかもしれませんが、大きなプロジェクトになると各機能をまとめて管理したいもの。 そういった時はやはりクラスの方が、管理・開発・メンテナンスしやすいのではないでしょうか?
Pythonのクラス機能が必要な場合・不要な場合
Pythonに限ったことではありませんが、クラス機能の学習って結構大変ですよね。それで学習前に、どういった場合にクラス機能が必要で、どういった場合は不要か、ということを予め理解しておくと学習コストのムダを省けると思います。
まずはPythonのクラス機能が使われている例をご紹介。
- Webアプリケーション / FlaskやDjangoなどのフレームワークで
- ゲーム / テトリス*、オセロ*などゲーム全般に
- 人工知能開発 / ニューラルネットワークを構成する層(レイヤー)をクラスで管理
Pythonを職業的に使う場合は、どうもクラスの理解が欠かせないようですね。 次にクラス機能が不要な場合を見てみます。
- レジや演算 / カフェやレストランのレジ機能や特定の演算処理など(参考ソース)
- データ収集 / Webスクレイピングなど
- 短絡的な自動化処理 / ファイルの一括編集処理やメールの自動送信などの限られた機能の自動化に
意外とクラス機能がなくてもPythonプログラムって楽しめるんですね。著書「退屈なことはPythonにやらせよう」では、クラス、一回も登場してきません。
さあ、それではここからは「Pythonのクラスが必要だな」という方むけに、Pythonのクラス機能の基本部分をご紹介していきます。
Pythonのクラス機能を学習する前に
Pythonのクラス機能を学び始めた途端、
- インスタンスが・・・
- メソッドについては・・・
- オブジェクトを・・・
といった専門用語が乱発します。 言葉の意味を直感的にイメージ、理解できますでしょうか? 改めてクラスの学習でよく出てくる言葉の意味を復習しておきます。
- モジュール/ Pythonコードでまとめたファイル
- オブジェクト/ 数値、文字列、関数などすべてを指す
- メソッド/ クラス機能で使う関数、
__init__()
もメソッドの一つ - インスタンス/ クラス内で作ったオブジェクト(処理機能など)のこと
上記でご紹介した用語も、恐らく学習初期はボンヤリと意味を理解していると思います。そこに複雑なクラス機能のコードが目から頭に入って行くと「混乱」「イライラ」「眠気」になりかねません。 視覚的にPythonのコードと機能、それからクラスのコード構成をラップさせて確認してみます。
Pythonの参考書やサンプルを動かしていて、「あれっ、どうだったかな」という時に振り返ってみると頭の中が整理できると思いますよ。
Pythonのクラスを書いてみよう
ファイル名 Hello.py
class MyClass:
def function(self):
print('Hello,Pythonのオブジェクト指向')
c = MyClass()
print(c.function())
こちらはとにかくクラス宣言をして、プリント文を出力するだけの簡単なコードになります。「オブジェクト指向はじめて」「クラス処理はじめて」という方にとって参考になるでしょう。 また「みんPy」をはじめとする参考書で「クラスのコードの実行方法がわからない」という方にとっても役立つと思いますね。
以下にコードの解説をご紹介。
<< コードの説明 >>
1 | class MyClass: | MyClassというクラスを作成 |
2 | def function(self): | メソッドの作成 |
3 | print('Hello,Pythonのオブジェクト指向') | インスタンスの作成 |
4 | ||
5 | c = MyClass() | クラスを利用したオブジェクトの作成 |
6 | print(c.function()) | メソッドの利用 |
次にPython特有の __init__()
メソッドを用いたサンプルを書いてみましょう。 Pythonのクラスでは、見慣れない __init__()
という関数がよく登場してきます。 少しずつ __init__()
に慣れて、クラス機能の全体把握に努めましょう。
ファイル名 Cat.py
class Cat():
def __init__(self,name,age):
self.name=name
self.age=age
def kawaii(self):
print('私は、' + self.name + '、' + self.age + '才よ。かわいいでしょ')
def okoru(self,distance):
print('私が怒ったのは、今日' + str(distance) + '回目よ')
first = Cat('みけ','11')
print(first.kawaii())
print(first.okoru(2))
<< コードの説明 >>
1 | class Cat(): | Catクラスを作成 |
2 | def __init__(self,name,age): | 使用するパラメーターの初期化 |
3 | self.name=name | 初期化作業 |
4 | self.age=age | 初期化作業 |
5 | ||
6 | def kawaii(self): | メソッド作成 |
7 | print('私は、' + self.name + '、' + self.age + '才よ。かわいいでしょ') | インスタンスの作成 |
8 | ||
9 | def okoru(self,distance): | もう一つメソッドを作成 |
10 | print('私が怒ったのは、今日' + str(distance) + '回目よ') | 上記メソッドのインスタンス作成 |
11 | ||
12 | first = Cat('みけ','11') | クラスを利用したオブジェクトの作成 |
11 | print(first.kawaii()) | メソッドの利用 |
12 | print(first.okoru(2)) | 引数を利用したメソッドの例 |
7 | print('私は、' + self.name + '、' + self.age + '才よ。かわいいでしょ') | インスタンスの作成 |
8 | ||
9 | def okoru(self,distance): | もう一つメソッドを作成 |
10 | print('私が怒ったのは、今日' + str(distance) + '回目よ') | 上記メソッドのインスタンス作成 |
11 | ||
12 | first = Cat('みけ','11') | クラスを利用したオブジェクトの作成 |
11 | print(first.kawaii()) | メソッドの利用 |
12 | print(first.okoru(2)) | 引数を利用したメソッドの例 |
今回ご紹介した __init__()
のような初期化処理は、「コンストラクタ」と呼ばれます。参考までに。
あともう一つ、クラスを複数ファイルで利用する場合をご紹介。 サンプルコードでクラスが登場してきた時に役立つと思いますよ。 上記でご紹介した Cat.py を2つのファイルに分割してみます。
まずはインスタンスが書かれたクラスファイルから。
ファイル名 Cat_function.py
class Cat():
def __init__(self,name,age):
self.name=name
self.age=age
def kawaii(self):
print('私は、' + self.name + '、' + self.age + '才よ。かわいいでしょ')
def okoru(self,distance):
print(self.name + 'が怒ったのは、今日' + str(distance) + '回目よ')
次にクラスを利用した実行ファイル。
ファイル名 Cat_Main.py
from Cat_function import Cat
sample = Cat('たろう','2')
print(sample.kawaii())
1 | from Cat_function import Cat | from ファイル名 import クラス名 使うクラスを指定する場合 |
2 | 使用するパラメーターの初期化 | |
3 | sample = Cat('たろう','2') | 引用している Cat_function.py 内のクラスを使ってオブジェクト作成 |
4 | ||
5 | print(sample.kawaii()) | メソッドの実行 |
実行したい機能が書かれたクラスコード Cat_function.py は、 __init__()
で紹介したコード Cat.py と同じです。 メインプログラム Cat_Main.py は、クラス機能を備えたプログラムを実行する一例。 上記の場合は、引用するPythonプログラム内のクラスを指定する場合です。
-- 上記コードの結果 --
中には、引用するPythonプログラム内にクラスが複数あって、オブジェクト毎にクラスを指定したい場合も。 その時は以下のように書くと、オブジェクト作成時にクラスを指定できます。
ファイル名 Cat_Main2.py
import Cat_function
sample2 = Cat_function.Cat('しんじろう','4')
print(sample2.okoru(3))
1 | import Cat_function | import ファイル名、使用するクラスはオブジェクト作成時に決定したい時、あとで作成したい時 |
2 | 使用するパラメーターの初期化 | |
3 | sample2 = Cat_function.Cat('しんじろう','4') | 引用している Cat_function.py 内のクラス Cat を使ってオブジェクト作成 |
4 | print(sample2.okoru(3)) |
-- 上記コードの結果 --
Pythonのクラスコーディングが楽になるツール
Pythonでクラスを書く時、 self という引数が頻繁に登場してきます。 クラス機能を実行する上では欠かせない「引数 self」ですが、毎度毎度入力するのは面倒くさいですし、オリジナルコード作成時では忘れることも。 そんなPythonのクラスコーディングを手伝ってくれるツールに「PyCharm」というIDEが存在。 PyCharm、データ容量こそ大きいものの「引数 self」を自動入力してくれます。 入力補助以外にも多くの開発者が、PyCharmを利用してWebアプリなどを作っていますので、時間とハードディスクに余裕のある方、参考にしてみて下さいね。
PyCharm
【必要な空き容量】 1.5 GB
【必要なメモリー】 最小 4 GB、推奨 8 GB
【料金】 フリープランあり($199/Year)
【公式ページ】 https://www.jetbrains.com/pycharm/
また Jupyter Notebook でPythonを学習している方もいらっしゃると思いますが、クラス学習については複数ファイルを利用する場合もありますので、テキストエディタやPyCharmのようなIDEで学習する方が捗ると思いますよ。
まとめ
Pythonのクラス、最初の内は参考書を読んでも、チュートリアルサイトを見ても、なかなか頭の中が整理できないですよね。私はPythonのクラスを学習した時、とにかく説明用語とコードがリンクしなかった、イメージできなかったため、時間とストレスがかかりました。 「ちょっとなるべく早くクラスをマスターしたい」「もうこれ以上ストレスには耐えられません」という方、諦めるまえに苦しむ前に一度プログラミング・スクールの受講を検討してみませんか?
マンツーマン&オンラインのプログラミングスクール CodeCamp は、あなたのPython学習を手伝ってくれると思いますよ。
尚、本稿ではPythonのクラス機能の基礎にフォーカスしているため、「継承」や「特殊メソッド」などは割愛させて頂いております。
- この記事を書いた人
- オシママサラ