Python初学者にとっての難関がクラス(class)です。
書き方はシンプルですが、概念がとても難しく雑な理解で済ませてしまう人が多くいます。
その原因は、クラスの意味について調べても、その定義に難しい言葉(「オブジェクト指向」「インスタンス」)などを使っていることにあります。
そこでこの記事では、できるだけ難しい言葉を使わず、クラスとは何なのかをイメージで説明します。
クラスを使いたくなる気持ちに焦点を当てています。
その反面、厳密な定義からは遠ざかってしますがご了承ください(そのため、Python公式ドキュメントのリンクも紹介しております)。
AIやデータサイエンスを学びたくてPythonを学び始めたけど
「独学ではやっぱり限界がある」
と不安を感じた方にオススメしたいのが、Aidemy Premium Plan。
AIに関する幅広い種類の講座や徹底したコーチング指導が特徴です!
実務を見据えてPythonをがっつり学習していきたい方は、まずは無料の「オンライン相談」に参加してみてください。
また、Aidemy Premium Planのメリットやデメリットなどについては、以下の記事も参考にしてください。
Aidemy(アイデミー)の評判と口コミまとめ!受講したほうがいい理由を紹介
Pythonのクラス(class)とは
Pythonの公式ドキュメントでは、classについて以下のように説明しています。
クラスはデータと機能を組み合わせる方法を提供します。新規にクラスを作成することで、新しいオブジェクト 型を作成し、その型を持つ新しいインスタンスが作れます。クラスのそれぞれのインスタンスは自身の状態を保持する属性を持てます。クラスのインスタンスは、その状態を変更するための(そのクラスが定義する)メソッドも持てます。
引用元: 9. クラス -Python公式ドキュメント
といっても、「オブジェクト型」「インスタンス」「属性」「インスタンス」などPythonを学習したての人には理解しがたい単語が並んでいます(他の解説サイトも同じような単語を使っていて混乱する)。
もちろん厳密な説明を行う上では、上記の難解な言葉の理解が必須になるのですが、ここではあえてそれらの単語を使わずにイメージをお伝えします。
Pythonのクラスとは、あるデータに必要な情報を持たせる設計図だと思ってください。
具体例をお伝えしましょう。
人間というクラスを作るとします。
すると人間には、どのような要素が必要でしょうか…?
名前・身長・体重・年齢・性別・趣味…などなど。
ここでは、名前・身長・体重・年齢・性別・趣味を人間を構成するのに最低限必要な情報だとし、これらを含んだ人間クラスをつくります。
ここで、Maoという変数を用意します。
Maoという変数は、プログラミング上ではただの変数であり、何か1つのデータしか持つことができません。
しかし、このMaoという変数に人間クラスを指定することで、名前・身長・体重・年齢・性別・趣味などの情報を持たせることができるのです(つまりMaoという変数が人間扱いされるのです)。
また、人間クラスには動作も指定することができます(人間の世界でいうと、歩く・寝るなどでしょうか)。
この「何でもなかった変数に人間クラスを指定する」という気持ちを忘れずに、記事を最後まで読めば、クラスの大まかな概念を理解できるでしょう。
Pythonのクラス(class)の基本的な定義
Pythonでは、基本的にclassを以下のように定義します。
def __init__(self):
(初期化時に行いたい処理)
(追加の関数)
①classと書く
②クラス名を書く(単語ごとに大文字から始めるのが一般的 e.g.ClassName)
③「:」を書く
④ def _init_(self):を書く(これはクラスを立ち上げたと同時にしたい処理を書く)
⑤初期化時に行いたい処理を書く
⑥追加の関数があれば書く
これだけの説明では分かりにくいと思うので、具体例をみてみましょう。
ここでは、名前・身長・体重というデータをもつ人間クラスをつくり、BMIを計算する処理を追加します。
BMIは、体重kg ÷ (身長m)2で計算できます。
[code language=”python”]class Human:
def __init__(self):
self.name = ”
self.weight = 0.0 # kgで入力
self.height = 0.0 # mで入力
def bmi_cal(self):
self.bmi = self.weight / self.height * 2[/code]
これで人間特徴を持った設計図を作ることができました。
それでは、Maoという変数に人間の特徴を持たせましょう。
[code language=”python”]Mao = Human() # Maoに人間の特徴(名前・身長・体重)を持たせる
# Maoに具体的な情報を与える
Mao.name = ‘真央’
Mao.weight = 50
Mao.height = 1.62
# 真央のBMIを算出
Mao.bmi_cal()
# 真央のBMIを出力
print(Mao.name, ‘のBMI: ‘, round(Mao.bmi, 2)) # 小数第3位で四捨五入
# 真央 のBMI: 61.73[/code]
ここで押さえておきたいのは、Maoという変数が「’真央’という名前」や「50という体重」「1.62という身長」を有している点です。
もちろん、同じHumanクラスを用いて、他の人間をつくることもできます。
[code language=”python”]Yuki = Human() # Yukiに人間の特徴(名前・身長・体重)を持たせる
# Yukiに具体的な情報を与える
Yuki.name = ‘有希’
Yuki.weight = 45
Yuki.height = 1.53
# 有希のBMIを算出
Yuki.bmi_cal()
# 有希のBMIを出力
print(Yuki.name, ‘のBMI: ‘, round(Yuki.bmi, 2)) # 小数第3位で四捨五入
# 有希 のBMI: 58.82[/code]
Pythonでのクラス(class)と関数の違い
クラスを勉強したばかりでよく思うのが、「クラスで書いても関数で書いてもあまり変わらないのでは?」ということ。
試しに、上記のMaoのBMIを計算するプログラムを関数で書いてみます。
関数について不安な方は、以下の記事をお読みください。
【Python初心者】関数の意味・定義・使い方・return文
[code language=”python”]def bmi_cal(name, weight, height):
bmi = weight / height * 2
print(name, ‘のBMI: ‘, round(bmi, 2))
Mao_name = ‘真央’
Mao_weight = 50
Mao_height = 1.62
bmi_cal(Mao_name, Mao_weight, Mao_height)
# 真央 のBMI: 61.73[/code]
結果はもちろん同じですが、クラスと関数の違いはどこにあるのでしょうか?
その答えは、‘真央’、50、1.62というデータ間の関係性にあります。
クラスでは同じ人間(Mao)が持つデータとして名前・体重・身長の間に関係性がありましたが、関数ではMao_name、Mao_weight、Mao_heightと別の変数で扱っているので、互いに関係性がありません。
初級の段階ではそのままでも問題はないのですが、中級・上級になるにつれクラスを使うことでできることが増えてくるので、今のうちから慣れておきましょう。
(今回は複雑になるので説明しませんが、意欲のある方は「カプセル化」「継承」「オーバーライド」などのキーワードを頭の片隅に置いておいてください)。
最後に: クラスは初級のPython学習で最上級に難しい!
クラスは、Pythonの学習を進めていく中でも難しい機能・概念だと思います。
この記事では難しい言葉を使わず説明しました。
より厳密な定義を知りたい方は、Pythonの公式ドキュメントも併せてお読みくださいね。
9. クラス -Python公式ドキュメント