このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】特殊メソッドの定義

特殊メソッドの定義

 Pythonでは、クラスに特殊メソッドを定義することで、演算子や組み込み関数などと連動して直感的にオブジェクトを扱えるようになります。これらの特殊メソッドは前後にアンダースコアが2つずつ付いた名前を持ち、C++やJavaでの「演算子のオーバーロード」に近い機能を提供します。特に、標準ライブラリにない新しいデータ構造を設計するときや、オブジェクトをユーザに見せる際の可読性を高めるときに大いに役立ちます。
 ここでは、オブジェクトを読みやすく表現する__str__ メソッドを中心に、特殊メソッドの仕組みを紹介します。

プログラムのダウンロード

 「ダウンロード」から実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.特殊メソッドとは

1.1.アンダースコアに囲まれた特別なメソッド

 Pythonには「__init__」「__str__」「__add__」など、前後に2つずつアンダースコアが付くメソッドが多数存在します。これらは「特殊メソッド」と呼ばれ、以下のようなタイミングや演算子に対して自動的に呼び出されます。

  • __init__ : コンストラクタとして、インスタンス生成時に実行される。
  • __str__ : print(オブジェクト)str(オブジェクト)で文字列を返すときに呼ばれる。
  • __add__ : +演算子を使ったときに呼ばれる。
  • … など

1.2.メソッドの名前を自由に決めるのとは異なる

 通常のメソッド名は自由に付けられますが、特殊メソッドはPythonインタプリタが状況に応じて自動的に呼び出す仕組みを提供しています。そのため、クラスに特殊メソッドを正しく定義しておけば、「どのように演算子や組み込み関数と連動するか」を自由にカスタマイズできます。

2.__str__メソッドによる出力形式の指定

2.1.printでの見やすさを向上させる

 クラスオブジェクトをprint()関数に渡すと、デフォルトでは「<__main__.ClassName object at 0x...>」のように、あまり人間向きではない形式で表示されます。そこで__str__を定義すれば、print()されたときに望み通りの文字列を返せます。

2.2.サンプル:2次元ベクトルの例

 以下のプログラムでは、2次元ベクトルを表すVec2クラスを定義し、__str__メソッドを実装しています。座標を表示するときに「(x, y)」形式で見やすくしてみましょう。

class Vec2:
    def __init__(self, x, y):
        """コンストラクタ:ベクトルのx座標とy座標を初期化"""
        self.x = x
        self.y = y
    
    def __str__(self):
        """
        print()関数などで表示する際に呼ばれる特殊メソッド。
        (x, y) の形式で返すことで、わかりやすい表現にする。
        """
        return f"({self.x}, {self.y})"

def demo_vec2():
    print("◆ __str__メソッドによる出力のデモ")
    v1 = Vec2(3, 5)
    v2 = Vec2(-1, 0)
    print("v1の内容:", v1)  # (3, 5)
    print("v2の内容:", v2)  # (-1, 0)

# メイン処理
if __name__ == "__main__":
    demo_vec2()
    print("特殊メソッドのデモが完了しました。")

解説

  • __init__ : オブジェクト生成時にx座標とy座標を受け取り、データ属性をセットする。
  • __str__print()str()で呼ばれ、人間が読める文字列を返す。座標を(x, y)形式に整形。
  • メリットVec2クラスをデバッグするときやログに表示するときに、何が格納されているか即座に把握できる。

実行結果

◆ __str__メソッドによる出力のデモ
v1の内容: (3, 5)
v2の内容: (-1, 0)
特殊メソッドのデモが完了しました。

まとめ

  • 特殊メソッドは、Pythonのクラスをより自然に扱うために用意されている仕組みです。
  • __str__を定義することでオブジェクトを人間向けに見やすい文字列に変換でき、print(オブジェクト)時の可読性が格段に上がります。
  • 同様に、__add____len__などの特殊メソッドを定義すると、演算子や組み込み関数との連携を自由にカスタマイズできるため、自作データ構造の操作をスムーズにします。

 このような便利な「特殊メソッド」を活用しながら、Python独自のオブジェクト指向設計をさらに深めていきましょう。