↓ メインコンテンツへスキップ
  1. 第07講 クラス(2/2)/

特殊なメソッド

特殊なメソッド
#

教科書 p.240(Lesson 8.6)

クラスに特別な名前のメソッドを用意することで、Python の組み込み関数の処理や演算子の処理を上書き(オーバーライド(override))できるようになります。 これらのメソッドは、特殊メソッド(special method) と呼ばれます。

特殊メソッドは、メソッド名の前後に __(アンダースコア2つ)を付けた名前を持ちます。 以下の通りです。aというオブジェクトに該当するメソッドが定義された場合、関数名(a) が呼び出せるようになります。

以下の他にも、オブジェクトを生成する際に呼び出される __new__ や、生成後に初期化する __init__、オブジェクトが削除される際に呼び出される __del__ などもあります。

定義するメソッド対応する関数/演算子概要
__str__(self)str(a)オブジェクトを文字列に変換する。
__format__(self)format(a)フォーマットした文字列を返す。
__int__(self)int(a)オブジェクトを整数に変換して返す。
__float__(self)float(a)オブジェクトを浮動小数点数に変換して返す。
__repr__(self)repr(a)式の評価となる文字列を返す。
__add__(self, other)a + other足し算の演算子が利用できるようになる。
__sub__(self, other)a - other引き算の演算子が利用できるようになる。
__mul__(self, other)a * other掛け算の演算子が利用できるようになる。
__truediv__(self, other)a / other割り算の演算子が利用できるようになる。
__floordiv__(self, other)a // other切り捨て割り算の演算子が利用できるようになる。
__mod__(self, other)a % other剰余の演算子が利用できるようになる。

コレクションに対する特殊メソッド
#

新たにコレクションのクラスを定義した場合、以下のメソッドを定義することもできます。

定義するメソッド対応する関数/演算子概要
__len__(self)len(a)コレクションの長さを返す。
__getitem__(self, key)a[key]要素を取得する。
__setitem_(self, key, value)a[key] = value要素に代入する。
__delitem__(self, key)del a[key]要素を削除する。
__iter__(self)iter(a)イテレータを返す。
__reversed__(self)reversed(a)逆順にするイテレータを返す。

その他の特殊メソッド
#

ここまでに挙げた以外にも様々な特殊メソッドがあります。 次のようなサイトにまとめられているので、参考にしてください。

特殊メソッドの例
#

例えば、平面上の点を表すクラスである Point を定義したいとします。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __str__(self):
        return f"({self.x}, {self.y})"
    def __add__(self, other):
        return Point(self.x + other.x, self.y + other.y)
    def __sub__(self, other):
        return Point(self.x - other.x, self.y - other.y)

p1 = Point(3, 4)
p2 = Point(2, 1)
p3 = p1 + p2
assert str(p3) == "(5, 5)", "加算が正しくありません"
p4 = p3 - p1
assert str(p4) == "(2, 1)", "減算が正しくありません"

このように、__str__ メソッドを定義することで、str 関数でオブジェクトを文字列に変換する際に、 __add__, __sub__ メソッドを定義することで、+, - 演算子を利用できるようになります。

組み込み型で定義されているメソッド
#

ここで紹介した特殊メソッドは、int やlist型などの組み込み型でも定義されています。 dir 関数を使うことで、そのオブジェクトが持つメソッドを確認できます。

>>> dir(int) # int型が持つメソッド一覧。
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'is_integer', 'numerator', 'real', 'to_bytes']
>>> dir(list) # list 型が持つメソッド一覧
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

このように、int 型にも様々な特殊メソッドが定義されています。 なお、引数も調べたい場合は、以下の type_inspector.py を用いてください。

📥 type_inspector.pyのダウンロード

$ python3 type_inspector.py int list
Type: list
	__add__(self, value)
	__contains__(self, key)
    ... 途中省略
	reverse(self)
	sort(self, key, reverse)
Type: int
	__abs__(self)
	__add__(self, value)
    ... 途中省略
	is_integer(self)
	to_bytes(self, length, byteorder, signed)