特殊なメソッド #
教科書 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)