Pythonで自分だけの「型」を作れるようになると、データの表現が安定し、コードの読みやすさと再利用性が大きく向上します。
本記事では、はじめてクラスを定義する初心者の方に向けて、class文の最小構成、インデントやコロンのルール、モジュールに分けて定義してimportする基本までを丁寧に解説します。
コンストラクタや継承などの応用は別記事で扱います。
クラス定義の基本
独自のデータ型を作るメリット
プログラム内で繰り返し登場する概念(例: 顧客、注文、座標)をクラスとして定義すると、その概念を1つのまとまりとして扱えるようになります。
これにより、データ(属性)と振る舞い(メソッド)を同じ型の中に整理でき、関数や辞書の寄せ集めよりも意図が明確になります。
さらに、クラスを型として扱えるため、引数や戻り値の意味が自明になり、チーム開発での合意形成や保守が容易になります。
クラス定義で押さえる最小要素
class文は「ヘッダ」と「本体」から成り、最低限は次の要素を押さえれば定義できます。
空の本体にpass
を書くと、形だけのクラスが作れます。
docstringは任意ですが、クラスの用途が伝わるため、早い段階から書くことを強く推奨します。
以下に最小要素を整理します。
要素 | 説明 |
---|---|
クラス名 | 型の名前です。後述のPEP 8に従いCapWords(先頭大文字の単語連結)で付けます。 |
コロン(:) | ヘッダの末尾に必須です。これを忘れると構文エラーになります。 |
インデント | 本体はインデントで1段下げます。PEP 8では半角スペース4個が推奨です。 |
本体 | 実装を書く領域です。何も書かない場合はpass を置きます。 |
docstring | 先頭行に三重引用符で用途を説明します。ツールやエディタが参照します。 |
class文の書き方と最小例
基本構文(class 名:)
Pythonのclass文はとてもシンプルです。
最小構文は次のようになります。
# 基本構文の形だけを示しています
class クラス名:
本体(インデントされたブロック)
クラス名の直後にコロンを書き、その次の行からインデントを1段下げて本体を書き進めます。
コロンとインデントのルール
クラス定義では次の2点を特に意識してください。
- コロンの付け忘れに注意します。
class Foo:
のコロンは必須です。 - 本体はインデントで構造化します。PEP 8では半角スペース4個を推奨し、タブとスペースの混在は避けます。
インデントがずれているとIndentationError
や意図しないネストになります。
エディタで「可視インデント」や「自動整形」を有効にすると防止できます。
最小のクラス定義例(passのみ)
まずはからのクラスを定義して、インスタンス(実体)を作るところまでを確認します。
# minimal_class.py
class Marker:
"""何らかの目印を表す最小のクラス。まだ中身はありません。"""
pass # 空の本体を明示します
# クラスからオブジェクト(インスタンス)を生成します
m = Marker()
# 生成結果を簡単に確認します
print(m) # 表示はデフォルトの形式です
print(type(m)) # mの型はMarkerであることが分かります
print(Marker.__name__) # クラス名の文字列を取得できます
<__main__.Marker object at 0x7f...>
<class '__main__.Marker'>
Marker
ここでは本体がpass
だけでも、クラスとして振る舞い、インスタンスを作れることが分かります。
振る舞い(メソッド)やデータ(属性)の追加は別記事で解説します。
モジュールにクラスを定義してimportする
クラスはモジュール(ファイル)に分けて定義し、必要な場所でimportして使います。
プロジェクトが大きくなるほど、この分割が重要になります。
まずはshapes.py
というモジュールにクラスを定義します。
# shapes.py
class Tag:
"""ラベルやタグを表す最小のクラス。用途の概要を1行で説明します。"""
pass
次に、別ファイルmain.py
から利用します。
# main.py
# モジュール全体をimportして参照する方法
import shapes
t1 = shapes.Tag() # モジュール名.クラス名で参照します
print(type(t1))
# クラスだけを直接importする方法
from shapes import Tag
t2 = Tag() # 直接クラス名で使えます
print(type(t2))
<class 'shapes.Tag'>
<class 'shapes.Tag'>
このように、モジュールにクラスを定義してimport
するのが基本の流れです。
プロジェクトでは「ドメインごと」にファイルを分け、名前が衝突しないように整理すると読みやすくなります。
命名とドキュメンテーション
クラス名の付け方(PEP 8)
PEP 8(公式スタイルガイド)では、クラス名は「CapWords」(単語の先頭を大文字、単語間は区切らない)を推奨しています。
名詞を使い、役割が一目で分かる名前にします。
良い例:
User
,OrderItem
,EmailValidator
避けたい例:
user
(先頭小文字は関数や変数向けの慣習)usr
,ODRItm
(意味が伝わらない省略)processData
(動詞中心でクラスの「もの」としての性格が弱い)
内部だけで使うクラスは、モジュール内での「非公開」の慣習として先頭にアンダースコアを付けることがあります(例: _CacheEntry
)。
クラスのdocstringの書き方
docstringはクラス直下の三重引用符で記述します。
最初の1行に短い要約を書き、必要であれば空行を挟んで補足説明を続けます。
ツールやエディタのヒントに表示されるため、最小でも1行は用意しておくと効果的です。
# docstring_sample.py
class Ticket:
"""イベントの入場券を表すクラス。
このクラスは識別子や価格などを保持する器として使います。
まずは最小の形から始め、必要に応じて機能を拡張します。
"""
pass
docstringは「この型は何を表すのか」「いつ使うのか」を短く示すことがポイントです。
実装の詳細や使用例は、別途サンプルコードやモジュールのREADMEに記載しても良いでしょう。
公開する名前の整理方法
モジュール外に公開するクラス名を制御したい場合は、2つの方法がよく使われます。
- 先頭にアンダースコアを付けた名前は、慣習的に「モジュール内部用」と見なされます。
__all__
に公開したい名前のリストを定義すると、from module import *
の対象を明示できます。
# catalog.py
__all__ = ["Product"] # このモジュールの公開APIとして明示
class Product:
"""カタログの商品を表すクラス。"""
pass
class _DraftItem:
"""内部で一時的に使うクラス(外部公開しない意図)。"""
pass
この整理は、利用者が「どれを使えばよいか」を迷わないための道しるべになります。
公開範囲を意識して名付けとエクスポートを設計しましょう。
定義時のチェックリスト
初心者が陥りやすい構文エラー
クラス定義の初学者がつまずきやすい箇所を挙げます。
いずれも簡単に防止可能です。
コロンの付け忘れ: class Foo:
の:
が抜けるとSyntaxError
になります。
インデントの不一致: タブとスペースの混在や段幅の不一致でIndentationError
になります。エディタでスペース4個に統一しましょう。
空の本体でpass
を書き忘れ: 何も書かないと構文的に本体が存在せずIndentationError
につながります。
ファイル名とクラス名の取り違え: import
時にModuleNotFoundError
を招くため、モジュール名(ファイル名)とクラス名を明確に区別して考えます。
エンコーディングに依存する全角記号の混入: コロンやスペースに全角が紛れると構文エラーの原因になります。半角を使います。
次の短い例は、コロン抜けによるエラーを再現しています。
# bad_syntax.py
# コロンがないためSyntaxErrorになります
class Broken
pass
File "bad_syntax.py", line 3
class Broken
^
SyntaxError: expected ':'
エラーメッセージの行番号とキャレット(↑)位置を手がかりに修正していきます。
定義の品質を上げる確認ポイント
最小のクラスを定義できるようになったら、次の観点を習慣にすると品質が安定します。
- 名前がドメインの概念を素直に表しているか(名詞で、CapWordsか)。
- 1行のdocstringで用途が伝わるか。必要に応じて補足説明を追加しているか。
- 空のクラスでも
pass
を明示しているか(意図の表明)。 - モジュール構成が適切か(クラスを関連モジュールに分割し、
__all__
やアンダースコアで公開範囲を整理しているか)。 - 実行して型や表示を一度確認しているか(手元で
type(obj)
を出力して検証)。
以下は、これらの確認を満たす最小クラスの例です。
# quality_example.py
class SessionToken:
"""セッション識別のためのトークンを表す最小のクラス。"""
pass
token = SessionToken()
print(type(token)) # 基本的な動作の確認
print(SessionToken.__doc__) # docstringの確認
<class '__main__.SessionToken'>
セッション識別のためのトークンを表す最小のクラス。
この程度の自己チェックを行うだけでも、後続の機能追加をスムーズに進められます。
まとめ
本記事では、Pythonのクラスを「独自のデータ型」として定義する最小限の知識に絞り、class文の基本構文、コロンとインデントのルール、pass
だけの最小定義、モジュールに分けてimport
する流れ、そして命名とdocstring、公開範囲の整理方法を解説しました。
まずは空のクラスからでも構いません。
用途を明確に名付け、短いdocstringを添え、モジュールに整理しておくことが、後の拡張やチーム開発に効いてきます。
コンストラクタや属性、メソッド、継承などの発展的な話題は別記事で段階的に学んでいきましょう。