メインコンテンツへスキップ
  1. 第09講 クラス(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__ メソッドを定義することで,+, - 演算子を利用できるようになります.

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

ここで紹介した特殊メソッドは,intlist型などの組み込み型でも定義されています. 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)