Pythonの「クラス」をマスターしよう:データと機能をひとつにまとめる魔法の設計図
![]()
【Yuki】
Hirokiくん、こんにちは。今日はPythonの中でも、少しだけ難しく感じてしまうかもしれない「クラス」という概念について、一緒にお話ししてみたいと思います。
プログラミングを始めたばかりだと、「なぜクラスが必要なの?」と思うこともあるかもしれませんが、これを使えるようになると、コードがとても整理されて、まるで魔法のように扱いやすくなるんですよ。
わたしも、最初は少し戸惑った記憶がありますが……ゆっくり説明していくので、安心してくださいね。
![]()
【Hiroki】
Yukiさん、こんにちは!よろしくお願いします。
「クラス」って、よく本やサイトで「設計図」に例えられているやつですよね?
なんとなくイメージはできるんですけど、実際に自分で書こうとすると、どう書けばいいのか、何のためにあるのか分からなくなっちゃうんです。
![]()
【Yuki】
そうですよね。概念だけ聞くと抽象的で、少し捉えどころがないかもしれません。
でも、実はクラスは「関連するデータと処理を、一つの箱にまとめておくための仕組み」だと考えると、少し分かりやすくなると思います。
今日は、基礎から最新のAIライブラリでの使われ方まで、丁寧にお伝えしますね。
クラスって何?:プログラミングの中の「設計図」
![]()
【Yuki】
まず、クラスの考え方を整理してみましょう。
Hirokiくんが言う通り、クラスはよく「設計図」に例えられます。
例えば、「車」というクラス(設計図)があったとします。
設計図には、「色は何か」「最高速度はどれくらいか」といった属性(データ)と、「走る」「止まる」といった動作(処理)が定義されています。
![]()
【Hiroki】
なるほど。設計図自体は「概念」のようなもので、実際に道路を走っている「実物の車」とは違うということですよね?
![]()
【Yuki】
その通りです。素晴らしいですね……。
その設計図から作られた実物のことを、プログラミングの世界では「インスタンス」と呼びます。
一つの設計図から、赤い車、青い車、速い車など、たくさんの実体を作ることができるんです。
これが、クラスを利用する最大のメリットの一つである「再利用性」に繋がります。
クラスの基本構造:class構文とselfの秘密
![]()
【Yuki】
では、実際にPythonでどう書くかを見てみましょう。
まずは、一番シンプルなクラスの書き方です。
class Student:
def __init__(self, name, grade):
self.name = name
self.grade = grade
def introduce(self):
print(f"僕は{self.name}です。{self.grade}年生です。")
![]()
【Hiroki】
あ、classっていうキーワードを使うんですね。
でも、この__init__とか、あちこちに出てくるselfっていうのが、正直よく分からないんです……。
![]()
【Yuki】
ふふ、そこが最初の壁ですよね。わたしも最初は、なぜ自分自身を指す言葉をわざわざ書くんだろうって思いました。
__init__は「コンストラクタ」と呼ばれる特別なメソッドで、インスタンスが作られた瞬間に自動的に実行される初期設定のようなものです。
そして、selfは「作られた自分自身」を指しています。
![]()
【Hiroki】
「自分自身」……ですか?
![]()
【Yuki】
はい。例えば、Hirokiくんというインスタンスが作られたとき、self.nameは「Hirokiくんの名前」という意味になります。
これがあるおかげで、複数のインスタンスを作ったときに、それぞれのデータが混ざらずに済むんです。
クラスという大きな枠組みの中で、「これは僕自身のデータですよ」と目印を付けているようなものだと思ってください。
インスタンス化:設計図から実体を生み出す
![]()
【Yuki】
次に、その設計図から実際にデータを作ってみましょう。これを「インスタンス化」と言います。
# インスタンスの作成
hiroki = Student("Hiroki", 2)
yuki = Student("Yuki", 4)
# メソッドの呼び出し
hiroki.introduce()
yuki.introduce()
![]()
【Hiroki】
あ、関数を呼び出すみたいに書けるんですね!
hiroki = Student("Hiroki", 2)と書くことで、__init__が動いて、僕専用のデータがセットされる……という感じでしょうか。
![]()
【Yuki】
その通りです。よく理解されていますね。
hiroki.introduce()と呼び出すと、内部ではselfにhirokiというインスタンス自体が渡されるので、ちゃんと「僕はHirokiです」と表示される仕組みになっています。
データ(属性)と振る舞い(メソッド)が、一つの変数の中にセットで入っている。これがクラスの大きな特徴です。
メソッドの追加:クラスに「振る舞い」を教える
![]()
【Hiroki】
データの持ち方は分かりました。
でも、ただデータを表示するだけなら辞書(dict)とかでも良さそうですけど、クラスを使う強みって他に何があるんですか?
![]()
【Yuki】
鋭い質問ですね……。
クラスの本当の強みは、そのデータを使った「専用の機能」を持たせられることにあると思います。
例えば、テストの点数を管理して、平均点を出したり、合否を判定したりする機能をクラスの中に閉じ込めることができます。
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def check_pass(self):
if self.score >= 60:
return "合格"
else:
return "不合格"
student_a = Student("田中", 85)
print(f"{student_a.name}さんの結果は{student_a.check_pass()}です。")
![]()
【Hiroki】
なるほど!
check_passという処理が、Studentというデータと密接に関係していることが一目で分かりますね。
これなら、コードが大きくなっても、どこに何の処理が書いてあるか迷わなそうです。
![]()
【Yuki】
そうなんです。関連するものをひとまとめにすることを「カプセル化」と言ったりしますが、これによってコードの見通しが良くなるんです。
大人数で開発するときや、将来の自分自身がコードを読み返すときに、きっと助けになってくれるはずですよ。
最新のAI開発でも使われるクラス:Googleの「google-genai」ライブラリを例に
![]()
【Yuki】
さて、もう少し具体的な、現代的な例も見てみましょう。
最近のAI(人工知能)を扱うプログラムでも、クラスの考え方は欠かせません。
例えば、Googleの最新AIモデルを利用するための「google-genai」というライブラリがあります。
最新の gemini-3-flash-preview モデルを使う場合も、クラスを使ってAIの「クライアント(接続者)」を定義するのが一般的です。
![]()
【Hiroki】
最新のAIライブラリでもクラスが使われているんですね!
どんな風に書くのか気になります。
![]()
【Yuki】
少し発展的ですが、クラスを使って「AIアシスタント」を定義するコードを書いてみますね。
現在の最新仕様に基づくと、以下のような構成になります。
from google import genai
class MyAI:
def __init__(self, api_key):
# APIクライアントをクラスの属性として保持する
self.client = genai.Client(api_key=api_key)
self.model_id = "gemini-3-flash-preview"
def ask(self, prompt):
# AIに質問を投げるメソッド
response = self.client.models.generate_content(
model=self.model_id,
contents=prompt
)
return response.text
# 使い方
# my_ai = MyAI(api_key="YOUR_API_KEY")
# print(my_ai.ask("Pythonのクラスについて教えて"))
![]()
【Hiroki】
わあ、かっこいい……!
MyAIというクラスの中に、AIとの接続情報や、「質問する」という機能がまとまっていますね。
![]()
【Yuki】
はい。このようにクラスを使うことで、APIキーの管理やモデルの指定といった細かい設定を外側から隠して、「ask()と呼ぶだけで答えが返ってくる便利な道具」として扱えるようになります。
もし将来、使うモデルを gemini-3-flash-preview から別のものに変えたくなったとしても、このクラスの中身を一行書き換えるだけで、他の場所は一切修正しなくて済みます。
これを「保守性が高い」と言ったりします。
![]()
【Hiroki】
なるほど。クラスを使いこなせれば、最新の技術もスマートに扱えるようになるんですね。
なんだか、少しずつクラスと仲良くなれそうな気がしてきました。
継承:既存の機能を再利用して拡張する
![]()
【Yuki】
その意気です。では、最後にもう一つだけ大切な機能を。
「継承」という仕組みについても触れておきますね。
これは、あるクラスの機能をベースにして、新しい機能を追加した別のクラスを作る仕組みです。
![]()
【Hiroki】
設計図をコピーして、さらに書き加えるようなイメージですか?
![]()
【Yuki】
まさにその通りです……。
例えば、先ほどの Student クラスを継承して、プログラミングを学ぶ ITStudent クラスを作ってみましょう。
class ITStudent(Student): # Studentクラスを継承
def study_programming(self):
print(f"{self.name}はPythonを勉強しています。")
it_hiroki = ITStudent("Hiroki", 90)
it_hiroki.introduce() # 親クラスのメソッドが使える
it_hiroki.study_programming() # 子クラス独自のメソッド
![]()
【Hiroki】
すごい! ITStudent には introduce メソッドを書いていないのに、使えるようになっています。
これなら、似たようなクラスを何度も一から書く必要がなくなりますね。
![]()
【Yuki】
そうなんです。これを活用すると、プログラムの重複が減って、とても効率的に開発が進められるようになります。
もちろん、最初は無理に使いこなそうとしなくても大丈夫ですよ。
「何かをひとまとめにする」「自分自身のデータは self で扱う」ということだけ、まずは覚えておいてくださいね。
まとめ:クラスを使いこなして一歩上のプログラミングへ
![]()
【Hiroki】
Yukiさん、ありがとうございます。
クラスって、ただの難しい決まりごとじゃなくて、プログラムを整理して使いやすくするための、優しい仕組みなんだなって感じました。
![]()
【Yuki】
そう言ってもらえると、わたしも嬉しいです。
プログラミングは、最初から完璧に理解しようとすると大変ですから……。
少しずつコードを書いて、エラーに出会って、それを直していくうちに、「あ、ここでクラスを使えば便利かも」と思える瞬間がきっとやってきます。
クラスを学ぶ際、もっと詳しく知りたい場合は、Pythonの公式ドキュメントを見てみるのもいいかもしれません。 少し難しい言葉も並んでいますが、確かな情報が載っています。
また、先ほど紹介したAIライブラリについては、Googleのドキュメントが参考になります。
![]()
【Hiroki】
ありがとうございます!
まずは簡単なクラスを作るところから練習して、いつかは最新のAPIを使った自分専用のツールを作ってみたいと思います。
![]()
【Yuki】
いいですね。Hirokiくんなら、きっと素敵なプログラムが書けるようになると思います。
もし途中で分からなくなったら、いつでも聞いてくださいね。
わたしはいつでも、このモニターの向こうで待っていますから……。
夜はまだ長いですし、自分のペースで、ゆっくり進んでいきましょう。
![]()
【Hiroki】
はい!頑張ります!
![]()
【Yuki】
……ふふ、応援していますね。
それでは、今日の講義はここまでです。お疲れ様でした。
「クラス」のサンプルコードを見る
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


