閉じる

はじめてのPythonクラス: class文の書き方と定義のコツ

Pythonで自分だけの「型」を作れるようになると、データの表現が安定し、コードの読みやすさと再利用性が大きく向上します。

本記事では、はじめてクラスを定義する初心者の方に向けて、class文の最小構成、インデントやコロンのルール、モジュールに分けて定義してimportする基本までを丁寧に解説します。

コンストラクタや継承などの応用は別記事で扱います。

クラス定義の基本

独自のデータ型を作るメリット

プログラム内で繰り返し登場する概念(例: 顧客、注文、座標)をクラスとして定義すると、その概念を1つのまとまりとして扱えるようになります。

これにより、データ(属性)と振る舞い(メソッド)を同じ型の中に整理でき、関数や辞書の寄せ集めよりも意図が明確になります。

さらに、クラスを型として扱えるため、引数や戻り値の意味が自明になり、チーム開発での合意形成や保守が容易になります。

クラス定義で押さえる最小要素

class文は「ヘッダ」と「本体」から成り、最低限は次の要素を押さえれば定義できます。

空の本体にpassを書くと、形だけのクラスが作れます。

docstringは任意ですが、クラスの用途が伝わるため、早い段階から書くことを強く推奨します。

以下に最小要素を整理します。

要素説明
クラス名型の名前です。後述のPEP 8に従いCapWords(先頭大文字の単語連結)で付けます。
コロン(:)ヘッダの末尾に必須です。これを忘れると構文エラーになります。
インデント本体はインデントで1段下げます。PEP 8では半角スペース4個が推奨です。
本体実装を書く領域です。何も書かない場合はpassを置きます。
docstring先頭行に三重引用符で用途を説明します。ツールやエディタが参照します。

class文の書き方と最小例

基本構文(class 名:)

Pythonのclass文はとてもシンプルです。

最小構文は次のようになります。

Python
# 基本構文の形だけを示しています
class クラス名:
    本体(インデントされたブロック)

クラス名の直後にコロンを書き、その次の行からインデントを1段下げて本体を書き進めます。

コロンとインデントのルール

クラス定義では次の2点を特に意識してください。

  • コロンの付け忘れに注意します。class Foo:のコロンは必須です。
  • 本体はインデントで構造化します。PEP 8では半角スペース4個を推奨し、タブとスペースの混在は避けます。

インデントがずれているとIndentationErrorや意図しないネストになります。

エディタで「可視インデント」や「自動整形」を有効にすると防止できます。

最小のクラス定義例(passのみ)

まずはからのクラスを定義して、インスタンス(実体)を作るところまでを確認します。

Python
# 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というモジュールにクラスを定義します。

Pythonshapes.py
# shapes.py
class Tag:
    """ラベルやタグを表す最小のクラス。用途の概要を1行で説明します。"""
    pass

次に、別ファイルmain.pyから利用します。

shapes.pymain.pyと同じフォルダに配置してください。

Python
# 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行は用意しておくと効果的です。

Python
# docstring_sample.py
class Ticket:
    """イベントの入場券を表すクラス。

    このクラスは識別子や価格などを保持する器として使います。
    まずは最小の形から始め、必要に応じて機能を拡張します。
    """
    pass

docstringは「この型は何を表すのか」「いつ使うのか」を短く示すことがポイントです。

実装の詳細や使用例は、別途サンプルコードやモジュールのREADMEに記載しても良いでしょう。

公開する名前の整理方法

モジュール外に公開するクラス名を制御したい場合は、2つの方法がよく使われます。

  • 先頭にアンダースコアを付けた名前は、慣習的に「モジュール内部用」と見なされます。
  • __all__に公開したい名前のリストを定義すると、from module import *の対象を明示できます。
Python
# catalog.py
__all__ = ["Product"]  # このモジュールの公開APIとして明示

class Product:
    """カタログの商品を表すクラス。"""
    pass

class _DraftItem:
    """内部で一時的に使うクラス(外部公開しない意図)。"""
    pass

この整理は、利用者が「どれを使えばよいか」を迷わないための道しるべになります。

公開範囲を意識して名付けとエクスポートを設計しましょう。

定義時のチェックリスト

初心者が陥りやすい構文エラー

クラス定義の初学者がつまずきやすい箇所を挙げます。

いずれも簡単に防止可能です。

コロンの付け忘れ: class Foo::が抜けるとSyntaxErrorになります。

インデントの不一致: タブとスペースの混在や段幅の不一致でIndentationErrorになります。エディタでスペース4個に統一しましょう。

空の本体でpassを書き忘れ: 何も書かないと構文的に本体が存在せずIndentationErrorにつながります。

ファイル名とクラス名の取り違え: import時にModuleNotFoundErrorを招くため、モジュール名(ファイル名)とクラス名を明確に区別して考えます。

エンコーディングに依存する全角記号の混入: コロンやスペースに全角が紛れると構文エラーの原因になります。半角を使います。

次の短い例は、コロン抜けによるエラーを再現しています。

Python
# bad_syntax.py
# コロンがないためSyntaxErrorになります
class Broken
    pass
実行結果
  File "bad_syntax.py", line 3
    class Broken
                ^
SyntaxError: expected ':'

エラーメッセージの行番号とキャレット(↑)位置を手がかりに修正していきます。

定義の品質を上げる確認ポイント

最小のクラスを定義できるようになったら、次の観点を習慣にすると品質が安定します。

  • 名前がドメインの概念を素直に表しているか(名詞で、CapWordsか)。
  • 1行のdocstringで用途が伝わるか。必要に応じて補足説明を追加しているか。
  • 空のクラスでもpassを明示しているか(意図の表明)。
  • モジュール構成が適切か(クラスを関連モジュールに分割し、__all__やアンダースコアで公開範囲を整理しているか)。
  • 実行して型や表示を一度確認しているか(手元でtype(obj)を出力して検証)。

以下は、これらの確認を満たす最小クラスの例です。

Python
# quality_example.py
class SessionToken:
    """セッション識別のためのトークンを表す最小のクラス。"""
    pass

token = SessionToken()
print(type(token))     # 基本的な動作の確認
print(SessionToken.__doc__)  # docstringの確認
実行結果
<class '__main__.SessionToken'>
セッション識別のためのトークンを表す最小のクラス。

この程度の自己チェックを行うだけでも、後続の機能追加をスムーズに進められます。

まとめ

本記事では、Pythonのクラスを「独自のデータ型」として定義する最小限の知識に絞り、class文の基本構文、コロンとインデントのルール、passだけの最小定義、モジュールに分けてimportする流れ、そして命名とdocstring、公開範囲の整理方法を解説しました。

まずは空のクラスからでも構いません。

用途を明確に名付け、短いdocstringを添え、モジュールに整理しておくことが、後の拡張やチーム開発に効いてきます。

コンストラクタや属性、メソッド、継承などの発展的な話題は別記事で段階的に学んでいきましょう。

Python 実践TIPS - クラスとオブジェクト指向
この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!