Pythonの特殊メソッド(__repr__,__str__,__bytes__,__bool__,__eq__)の利用方法
pythonには、_(アンダースコア)が2つで始まり2つで終わる特殊メソッドと呼ばれるメソッドがある。
特殊メソッドは、明示しなくても特定の処理を実行した場合に内部で呼び出される。
例えば、
a + b
とするとき、内部で
a.__add__(b)
というようにaインスタンスの__add__()メソッドを呼び出す。
__init__, __new__, __del__なども代表的な特殊メソッドである。
(詳細はこちら)
Pythonには、以下のような特殊メソッドがある。
__repr__ | repr(object)のとき、呼び出され、オブジェクトの情報を表す文字列を返す。 |
__str__ | str(object),print(object)など呼び出され、オブジェクトを文字列に変換して返す。__str__が定義されていない場合__repr__が呼び出される |
__bytes__ | bytes(object)などで呼び出され、オブジェクトをbytes型で返す。 |
__hash__ | オブジェクトのハッシュ値で返す。 |
__bool__ | obj1 or obj2 のようなブール演算を行うとき、またはbool(obj)の場合に呼び出される |
比較演算
< | __lt__(self, object) |
<= | __le__(self, object) |
== | __eq__(self, object) |
!= | __ne__(self, object) |
> | __gt__(self, object) |
>= | __ge__(self, object) |
- 特殊メソッドの利用例(__repr__)
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self): # repr(Humanインスタンス)の際に呼び出される
return "Humanオブジェクトです"
taro = Human("Taro", 21)
jiro = Human("Jiro", 20)
taro_2 = Human("Taro", 21)
nanashi = Human("", 32)
print(repr(taro)) # Humanオブジェクトです
- 特殊メソッドの利用例(__str__)
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self): # str(Humanインスタンス)の際に呼び出される
return "名前は{}で、年齢は{}です".format(self.name, self.age)
taro = Human("Taro", 21)
jiro = Human("Jiro", 20)
taro_2 = Human("Taro", 21)
nanashi = Human("", 32)
print(str(taro)) # 名前はTaroで、年齢は21です
- 特殊メソッドの利用例(__bytes__)
def __init__(self, name, age):
self.name = name
self.age = age
def __bytes__(self): # bytes(Humanインスタンス)の際に呼び出される
return "{}{}".format(self.name, self.age).encode("UTF-8") # nameとageを文字列にして、utf-8でencodeしてbytes配列にして返す
taro = Human("Taro", 21)
jiro = Human("Jiro", 20)
taro_2 = Human("Taro", 21)
nanashi = Human("", 32)
print(bytes(taro)) # b'Taro21'
- 特殊メソッドの利用例(__hash__)
def __init__(self, name, age):
self.name = name
self.age = age
def __hash__(self): # hash(Humanインスタンス)の際に呼び出される
return hash("{}{}".format(self.name, self.age)) # nameとageを文字列にし、hash値にして返す
taro = Human("Taro", 21)
jiro = Human("Jiro", 20)
taro_2 = Human("Taro", 21)
nanashi = Human("", 32)
print(hash(taro)) # -3906044921558198740(ハッシュ値)
- 特殊メソッドの利用例(__bool__)
def __init__(self, name, age):
self.name = name
self.age = age
def __bool__(self): # 名前があるときはTrue、名前がないときはFalseを返す
if self.name != "":
return True
return False
taro = Human("Taro", 21)
jiro = Human("Jiro", 20)
taro_2 = Human("Taro", 21)
nanashi = Human("", 32)
if (taro): # AAAAAAAAAA
print("A" * 10)
if (nanashi): # 何も表示されない
print("B" * 10)
- 特殊メソッドの利用例(__eq__)
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other): # object1 == object2の時呼び出される。nameとageが等しいときにTrueを返す
if self.name == other.name and self.age == other.age:
return True
return False
taro = Human("Taro", 21)
jiro = Human("Jiro", 20)
taro_2 = Human("Taro", 21)
nanashi = Human("", 32)
print(taro == jiro) # False
print(taro == taro_2) # True