特殊なメソッド#
教科書 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 を用いてください。
$ 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)