【実践試験Tips.3】学習のポイント Pythonのクラス

こんにちは、Pythonエンジニア育成推進協会 顧問理事の寺田です。私は試験の問題策定とコミュニティ連携を行う立場です。

実践試験Tipsは、当協会のPython3エンジニア認定実践試験を受験される予定の方に向けて、何回かに分けてちょっとした情報をお伝えしていく目的で作成しています。

前回は主教材Chapter3 Pythonの言語仕様についてお話しました。

今回はChapter4 Pythonのクラスについてお話したいと思います。これからクラスやオブジェクト指向を学ぶという方はぜひこの記事を読んでみてください。

■学習のポイント:Chapter4 Pythonのクラス

Python3エンジニア認定実践試験は、主教材「Python実践レシピ」(技術評論社)の中から出題されます。

出題範囲については以下のページをご確認ください。

https://www.pythonic-exam.com/exam/jissen

主教材のChapter4では、Pythonのクラスについて解説されています。

Pythonの言語仕様やオブジェクト指向を理解しておかなければ、試験の得点は取れないと考えて頂ければと思います。

この章からの出題数は3問(7.5%)になりますので、全体から見るとそれなりの出題範囲です。

他の言語でオブジェクト指向やクラスを使っていた人にとっては、少し学習する程度で済みますが、プログラミングを学んだことが無い人や、あまり使う機会がなかった人にとってはこの範囲の学習はなかなか難しいと感じる人が多いと思います。

そのため、初心者にPythonを教える際には、クラスに関しては後から学習すればいいと伝えていますが、その後、よりPythonを活用していこうと考える段階になれば1つのハードルとなります。

ただ、難しいからとあきらめずに、しっかり理解できれば、Pythonの他の部分の理解もより進んでいくと思います。

実際問題、Pythonは様々なものがクラスを使って実装されていますので、クラスを理解できれば、Pythonがどう作られているのか、なぜそうした動き方をするのか知ることができます。それが他の章の理解にもつなげることができます。

ぜひ「クラスを理解しました」と言えるぐらい、学習してもらいたいと思います。これからクラスやオブジェクト指向を学ぶという方はぜひこの記事を読んでみてください。

■昨今のプログラミング傾向とPythonにおけるクラスの重要性

最近Pythonを書いていると、クラスを書く場面が以前と比べると、とても増えたと感じています。

これは以前紹介したFastAPI(記事)やDjangoなどのフレームワークを使う場合には、当然、クラスを継承して何かを作ることはよくあることのため、クラスの登場頻度が増える傾向になります。

これは以前からもあったパターンではありますが、最近はPythonを書くときには型安全にしたいという場面がより増えており、それに伴い、型ヒント(タイプヒント)を一緒に書くという機会が増えています。例えばデータの受け渡しや入力値などをPythonのクラス化をして受渡するといったことです。これらを支えるのが、Python 3.7で登場したdataclassです。書籍でも4.4の1節を使って説明しています。

この理由としては、安全に大規模なものを作りたい、または、メンテナンスしやすいものが作りたいと考えられることが増えているため、あえてクラスを使ってしっかりデータモデル化するというようなことがされています。実際、私自身もそうすることが増えています。

そのため、この実践試験においても主教材の5章にある型ヒントも出題しています。

また、昨今のAI時代において、AIにコーディングしたり、手助けしてもらったりする際、型が安全なものなのか、データの型がしっかりしたものになっているのかということを確実にしておくと、改造しやすくなりますので、AI側からしてもわかりやすくなります。そのため、Pythonのクラスを使ってデータ構造をしっかり表してあげる方が、より現代のコーディングスタイルに合うようになると考えられていることもあって、クラスが使用される機会が増えているのだと思います。

書籍では紹介していませんが、Pydantic (パイダンティック)という、FastAPIでも使われているデータの検証ツール(データバリデーション)があります。このPydanticもクラスを使って表現されています。オブジェクトの入出力の安全性やデータの安全性がデータ検証をした安全なデータであることが証明され、このクラスがうまくはまってくるということがあります。

こういった背景からクラスの重要性が上がっていると考えられますので、覚えておいていただいた方が良いかと考えています。

■学習のポイント:Chapter4 Pythonのクラス

さて、書籍ではクラスを5節にわけて説明しています。

1節目ではPythonでクラスの構文を定義する方法が書かれています。

クラス構文はまず、[class クラス名:]と書くことから始まります。書籍ではUserという名前のクラスがつけられています。

  • クラスと属性(1節)

ここからがなかなかわかりにくいところになりますが、クラスには属性があります。クラスは最終的にオブジェクトになりますが、そのオブジェクトに何かしらの属性を持たせることができます。そうして持たせることができる属性の中にはdefで宣言することができるメソッドもあります。これはdefを使って宣言するため、関数と同じような宣言の仕方ができますので、このクラスの中にある関数がメソッドであると最初の内は考えても良いかとは思います。

ただ、ほぼほぼ関数みたいなものだとは言え、最初の引数にselfを書くことでメソッドとして宣言する必要はあります。

つまり、クラスの中には属性とメソッドがあるということですが、メソッドの中にはメソッド自体の属性を持つこともできます。これは実際にはインスタンス変数と呼ばれます。

この辺りのどういった感じで渡り合っていくのかというのが分かりにくいため、理解しにくい面はあるかと思いますが、とりあえずは「そういうものだ」と考えておいてください。

  • インスタンス化と特殊メソッド(1節、2節)

さて、クラス自体はインスタンス化されて使うものになります。

クラスは、準備されたひな形のようなもので、そのひな形を使って実体を作ることをインスタンス化と言います。

例えば、氏名、年齢、住所といった属性情報を設定したひな形(クラス)があったとします。ここに氏名の属性として「寺田」という値を与えることで、具体的な実体(インスタンス)が作られます。他の人の名前が入ればまた別のインスタンスが作成されます。このようにどんどんインスタンスが増えていくのですが、このインスタンスを作ることができるものがクラスです。インスタンスという言葉自体はAWSのようなクラウドサービスでも聞かれますが、あれも「ひな形から実体を作る」という意味では同じ概念といえます。つまりクラスは同じような特性を持つものをいくつも作ることができるということです。

ではどうやってインスタンス化するかというと、インスタンス化の際に呼び出されるデータを初期設定するための __init__ という特殊メソッド(Pythonの場合はアンダースコア2つで始まるコンストラクタを使う)を入れておき、実行されることでインスタンス化させることができます。

Pythonの場合、ルールで特殊メソッドが決まっていますので、この特殊メソッドがどのようになっているかを理解することができれば、クラスの基本的な仕組みについてはある程度の理解ができたということになります。

書籍だけでは難しいところもあるかもしれませんが、他の情報も確認しつつ、理解を深めてほしいと思います。

  • クラスの継承(3節)

オブジェクト指向の世界では、継承もよく利用されている技術です。クラス(ひな形)を継承して、別のクラスを作れることができますので、とても便利な機能です。

例えば、学校関係者の個人情報(属性:名前、住所、年齢、専門分野等)を取り扱うためにTeacherというクラスを作成したとします。その後、生徒用のクラスStudentを作る場合、属性の一部分は同じであることが多くなります。この場合、Teacherクラスを継承することで派生した新たなクラスStudentを作成することができます。派生したクラスに対しては項目を拡張することも可能なので、学年などの新たな属性を追加することができます。

  • データクラス(dataclass)(4節)

データを受け渡しするときに便利なクラスです。コンストラクタを省略して、データクラスとしておくことで、型ヒント付きの属性として定義すれば、実際にデータ属性として持つことができます。

これを使用すると、コーディング量をとても少なくすることができ、データを格納していくためのものとして使えるようになります。

もし初めてクラスを扱う際、何から扱うかに悩むのなら、まずは関数の引数に受け渡しに使うようなものや、関数の戻り値になるものをデータクラス化して受け渡すというようなことから始めてみることをお勧めします。

関数の引数や戻り値にタプルで渡したり、辞書で渡したりするということ自体、結構複雑なデータ構造になることはよくあります。例えば、最終的にJSONを出力したいという場合、大抵はJSONに出力する前の段階で辞書やリストを使うような構造になりますが、それに対してデータクラスでどういう属性をもっているものかをしっかり定義して宣言することで、どういったデータが受け渡しされるかが理解できるようになるため、データの安全性があがります。

また、データクラスの場合、型が書かれます。例えばnameという属性はstrであると書かれていれば、そのクラスには必ずnameという属性が文字列であるということになりますので、辞書の中にnameというキーがあるかという判定をする必要がなくなりますし、nameが文字列ではないという可能性をなくすことができますので、コード上保証され、.upperというメソッドをそのまま使うことができるというように簡潔にすることができます。

とても便利に使えますので、クラスにあまり馴染みがないという方は、今まで辞書やタプルでデータを受け渡していた部分をデータクラス化してみることからチャレンジしてみると理解が深まるかと思います。

コーディングエージェントなどを使っていく中で、型ヒントはとても便利で安全に使えますのでおすすめです。

  • オブジェクト関連の関数(5節)

クラスやインスタンス化されたオブジェクトに対して、例えば、type()組み込み関数に渡すことでどういった型なのかを返すことができます。この節ではいくつかの便利な関数が書かれていますので、覚えて頂ければデバッグなどの場面で使用することができます。ぜひ書籍に書かれているものを覚えてみてください。

■まとめ:Pythonのクラス

ここまで書いたことをイメージしやすいように例としてまとめてみます。

例えば、WordPressなどのCMSをイメージするとわかりやすいかもしれません。CMSでは先に記事の項目が設定された状態のテンプレートが用意されており、ユーザーはそのテンプレートに沿って項目を入力していきます。入力後、保存や公開といった操作を行うことで、記事として実体を持つようになります(ここではこれをインスタンス化と考えます)。インスタンス化された後、その情報はデータベースに保存され、記事一覧に出てくるようになります。

この時、そのインスタンス化された情報には日付(公開日・変更日)やステータスといった属性情報も持っており、それらに対して自動的に保存する、アップデートするといった仕組みを大抵持っています。これがオブジェクト指向の考え方ということになります。

また、WordPressは記事の画面を開かずに、公開・非公開のステータスを選択できたり、タグの追加をしたりといったことができますが、これらはメソッドとして準備されたものです。

クラスやオブジェクト指向に関しては、本当にこの短い時間と短い内容ですべてを理解することは非常に難しいことで、本来であれば半年ぐらいかけてじっくり学ぶべきものだと言われているものです。

今回のこの記事だけで理解できるというのはなかなか難しいかもしれませんが、その理解の1つの助けになれればと思います。

PAGE TOP