プログラムで扱いたい情報や振る舞いが増えると、辞書やリストだけでは表現しづらくなります。
そこで登場するのがクラスです。
クラスは自分専用のデータ型を定義する仕組みで、Pythonではclass文で宣言します。
本記事では、定義の基本とコツに焦点を絞って、初心者でも迷わない最小限の知識を丁寧に解説します。
クラスとは(独自のデータ型)
独自のデータ型を作る理由
現実の対象は、単一の値で表しきれません。
例えばユーザーという対象は名前、年齢、メールなど複数の情報を持ち、それらに対する操作も必要になります。
クラスは関連するデータと振る舞いをひとまとめにし、まとまりのある「型」を作るための道具です。
これにより、コードの見通しが良くなり、ミスが減り、再利用性が高まります。
辞書にバラバラに値を入れるのではなく、クラスとして型を定義することで、意図が明確になり、IDEの補完や型チェッカも助けてくれます。
クラスとclass文の関係
クラスを作るにはclass文を使います。
class文は「クラスオブジェクト」を生成するための宣言です。
classブロック内で定義した名前はクラス属性になり、ブロックが終わるとクラスオブジェクトが完成します。
つまりclassは関数定義のdefと同様に「新しい名前を作る」構文ですが、作られるのは関数ではなく「型」です。
クラスと関数の違い
関数は「処理のまとまり」で、呼び出すと何かを計算して結果を返します。
クラスは「型の設計図」で、呼び出すとその型のインスタンス(実体)が返ってきます。
Pythonではクラスも「呼び出し可能」である点は共通ですが、役割は異なります。
混同しないように、関数は処理、クラスは型と覚えておくと理解しやすくなります。
以下の表は、初心者が混同しがちな観点を短く比較したものです。
| 観点 | 関数(def) | クラス(class) |
|---|---|---|
| 目的 | 処理をまとめる | 型を定義する |
| 呼び出し結果 | 値(戻り値) | インスタンス(実体) |
| 定義ブロック内の代入 | ローカル変数 | クラス属性 |
| ドキュメント文字列 | 関数の説明 | 型の説明 |
class文の基本構文(定義の書き方)
classヘッダとコロンの書式
class文はヘッダ行と、インデントされたブロックからなります。
ヘッダはクラス名と末尾のコロンが必須です。
初心者はこのコロン:を忘れがちなので注意してください。
# 最も基本的な構文
class クラス名:
# ここがクラスブロック(インデント必須)
# クラス属性やメソッド(振る舞い)を定義します
...
ヘッダの文法メモ
- 継承しない場合:
class Name: - 継承する場合:
class Name(Base):など(本記事では詳細は扱いません)
最小のクラス定義(pass)
とりあえず空のクラスを用意したい時はpassを使います。
これは「何もしない」という意味の文です。
# 空の独自型を定義する最小例
class Empty:
"""空のクラスの例。属性やメソッドはまだありません。"""
pass # ひとまず空で後から中身を追加したい時に使います
上のコードは出力をしません。
後から属性やメソッドを追加して育てていく前提の「器」を作る時に便利です。
名前の付け方(PascalCase)
クラス名はPascalCase(各単語の先頭を大文字にする)が通例です。
読みやすさを最優先にし、略語は必要最低限にとどめます。
| 良い例 | 悪い例 | コメント |
|---|---|---|
| UserProfile | userprofile | 先頭大文字で単語境界を明示 |
| HttpRequest | http_request | 略語も先頭大文字で単語として扱う |
| ProductId | productID | 一貫性が重要。単語の大文字化を揃える |
| CsvReader | CSVReader | すべて大文字は避けるのが無難 |
迷ったら「対象は何か」を名詞で、役割は端的に表現してください。
クラスdocstringの付け方
クラスの先頭に文字列リテラルを書くと、そのクラスの説明文(docstring)になります。
自分や他人が後で使う時の手がかりになるので、役割や前提、簡単な使い方を1〜3行で書きましょう。
class Temperature:
"""摂氏の温度を表す簡易クラス。
単位は摂氏(Celsius)固定。
"""
pass
# docstringは __doc__ から参照できます
print(Temperature.__doc__)
摂氏の温度を表す簡易クラス。
単位は摂氏(Celsius)固定。
クラス定義のコツ(初心者向け)
1クラス=1責務を意識する
クラスは何でも入れられる万能箱ではありません。
1クラスにつき1つの明確な責務を決めて、その責務に直接関係のない機能は分離します。
例えば「ユーザー情報」と「パスワードハッシュの計算」を同じクラスに詰め込みすぎると複雑化します。
役割を分けることで、テストがしやすく、変更に強い設計になります。
モジュール内の配置とファイル構成
小さなスクリプトでは同じファイルにクラスを定義して構いませんが、規模が大きくなるほど1モジュール1トピックに整理すると見通しが良くなります。
関連性の高いクラスは同じモジュールに、無関係なクラスはファイルを分けましょう。
project/
models/
user.py # User, UserProfile などユーザー周り
product.py # Product, Price など商品周り
services/
mailer.py # メール送信サービス
app.py # 実行スクリプト(必要最小限の処理のみ)
特に「実行スクリプト」と「定義」は分けるのがコツです。
定義を分けることで、他の場所からインポートして再利用しやすくなります。
クラスブロックのインデントと実行タイミング
classブロック内のコードはクラス定義時に1回だけ実行されます。
関数のように「呼ばれた時」ではない点に注意してください。
これを体感するには、クラスブロック内でprintしてみるのが早道です。
print("モジュールの先頭を実行")
class Demo:
print("クラス定義中に実行されるコード") # ここは定義時に1回だけ走る
x = 42 # これはクラス属性になる
print("クラス定義の後に実行")
モジュールの先頭を実行
クラス定義中に実行されるコード
クラス定義の後に実行
この挙動により、クラスブロック直下に重い計算やI/Oを書くのは避けるべきです。
必要なら、後で呼び出すメソッドや関数の中に移動しましょう。
エラーを避けるポイント(コロン/インデント/pass)
初心者がつまずきやすいのはコロンの付け忘れとインデントのズレです。
空のクラスを書き始めたものの中身が決まっていない時はpassを置いておくと安全です。
# 悪い例1: コロン忘れ
# class BadClass
# pass
# 悪い例2: インデントが不足
# class BadClass:
# pass
# 良い例
class GoodClass:
pass
エラーメッセージの例は次のようになります。
慌てず該当行の末尾とインデント幅を確認しましょう。
File "example.py", line 2
class BadClass
^
SyntaxError: expected ':'
よくある疑問とつまずき
class Name: と class Name() の違い
Python 3では、継承しない場合はどちらでも動作します。
つまりclass Name:とclass Name():は等価です。
ただしPEP 8では、継承がない時は括弧を省くのが推奨です。
理由は見た目が簡潔で、継承の有無が一目でわかるからです。
class A:
pass
class B():
pass # 技術的にはOKだが、継承がないなら括弧は省くのが慣習
一方、継承する場合は括弧内に親クラスを書きます。
空の括弧は「親がいない」ことを明示しないので、読み手には紛らわしくなります。
objectを明示しなくてよい?
はい、Python 3では明示不要です。
すべてのクラスは自動的にobjectを継承するため、class Name(object):とclass Name:は等価です。
Python 2では意味がありましたが、現代のPython 3では書かないのが一般的です。
# どちらも同じ意味(Python 3)
class Modern:
pass
class ModernExplicit(object):
pass
クラスはどこに書くべき?
基本はモジュールのトップレベルに書きます。
関数の内側でクラスを定義することもできますが、初心者には推奨しません。
トップレベルに置くと、インポートやツール(型チェック、シリアライズなど)が正しく動作しやすく、可読性も高まります。
例外は「限定的なスコープの一時的な型」が本当に必要な時だけです。
- 関連記事:はじめてのクラス継承: 基本ルールとオーバーライド
- 関連記事:@dataclassで__init__と__repr__を自動生成する方法を解説
- データモデル › 新しいクラスの作成 — Python 3.13.7 ドキュメント
まとめ
クラスは独自のデータ型を定義するための設計図で、Pythonではclass文を使って宣言します。
まずは正しい構文(ヘッダのコロンとインデント)を身につけ、PascalCaseの命名と簡潔なdocstringで分かりやすく定義するところから始めましょう。
クラスブロックは定義時に実行されるため、重い処理を直下に書かないこと、空の定義にはpassを置くことが実務で効きます。
Python 3ではclass Name:で十分で、objectの明示や空の括弧は不要です。
小さく始めて、1クラス1責務を守り、モジュールを整理することが、後々の拡張や保守を大きく助けてくれます。
