次の基本的な特殊メソッドの使い方についてご紹介します。
__init__ , __str__ , __eq__, __hash__ , __bool__, __len__
特殊メソッドとは
インスタンスに対してさまざまな操作を行えるようにするメソッドのことです。
たとえば、特殊メソッドを定義すると次のような操作が行えます。
・インスタンスの初期化
・インスタンス同士の比較
・数値として演算
特殊メソッドの名前は、処理名をアンダースコア2つ( __ )で囲んだものとなります。
例:
__init__
__str__
__eq__
マニュアル
詳細やその他の特殊メソッドについて知りたい方はこちらのドキュメントをご参照ください。
Python 言語リファレンス
https://docs.python.org/ja/3/reference/datamodel.html#specialnames
概要
__init__
クラスをインスタンス化した際の、初期設定を定義する。
__str__
インスタンスの情報を文字列として出力できるようにする。
__eq__
インスタンス同士を比較した際に、このメソッドで設定した変数で判定を行う。
変数の値が同じならTrueを返し、違っていればFalseを返す。
__hash__
インスタンスにハッシュ値を設定する。
__bool__
インスタンスに条件を設定し、その条件を元に真偽値を返すようにする。
__len__
インスタンスにlen関数を実行した際に返す値を設定する。
各特殊メソッドの使い方
__init__
クラスをインスタンス化した際の、初期設定を定義する。
今回はクラスの引数で指定した値が初期変数として設定される。
# 特殊メソッドの定義
class Human:
def __init__(self, name, age, phone_number):
self.name = name
self.age = age
self.phone_number = phone_number
# 特殊メソッドの利用
man = Human('itiro', 30, '080-1111-2222')
print(man.name)
print(man.age)
print(man.phone_number)
# 出力結果
itiro
30
080-1111-2222
__str__
インスタンスの情報を文字列として出力できるようにする。
今回はインスタンス化した際の初期変数を組み合わせ、
その値をメソッドの情報として出力するようにしている。
# 特殊メソッドの定義
class Human:
def __init__(self, name, age, phone_number):
self.name = name
self.age = age
self.phone_number = phone_number
# インスタンスの情報を文字列情報として出力できるようにする
def __str__(self):
return self.name + ',' + str(self.age) + ',' + self.phone_number
# 特殊メソッドの利用
man = Human('itiro', 30, '080-1111-2222')
print(man)
# 出力結果
itiro,30,080-1111-2222
__eq__
インスタンス同士を比較した際に、このメソッドで設定した変数で判定を行う。
変数の値が同じならTrueを返し、違っていればFalseを返す。
今回は、名前と電話番号が等しいなら、同じインスタンスとみなす設定をしている。
# 特殊メソッドの定義
class Human:
def __init__(self, name, age, phone_number):
self.name = name
self.age = age
self.phone_number = phone_number
# 名前と電話番号が等しいなら、同じインスタンスとみなす設定をしている
def __eq__(self, other):
return (self.name == other.name) and (
self.phone_number == other.phone_number)
# 特殊メソッドの利用
man1 = Human('itiro', 30, '080-1111-2222')
man2 = Human('itiro',18,'080-1111-2222')
man3 = Human('itiro',18,'090-1111-2222')
print(man1 == man2)
print(man2 == man3)
print(man3 == man1)
# 出力結果
True
False
False
__hash__
インスタンスにハッシュ値を設定する。
以下の例では、変数nameとageを元に、インスタンスごとにハッシュ値を生成している。
# 特殊メソッドの定義
class Human:
def __init__(self, name, age, phone_number):
self.name = name
self.age = age
self.phone_number = phone_number
# インスタンスにハッシュ値を設定する。
def __hash__(self):
return hash(self.name + str(self.age))
# 特殊メソッドの利用
man1 = Human('itiro', 30, '080-1111-2222')
man2 = Human('itiro', 30, '090-3333-2222')
man3 = Human('itiro',18,'080-1111-2222')
man4 = Human('Jiro',18,'080-1111-2222')
print(hash(man1))
print(hash(man2))
print(hash(man3))
print(hash(man4))
# 出力結果
4144865406459378187
4144865406459378187
-4441049106806873170
-202506817938093123
__bool__
__bool__はインスタンスに条件を設定し、その条件を元に真偽値を返すようにする。
今回はインスタンスに年齢を設定しており、20才以上であればそのインスタンスはTrueとなるよう定義をおこないる。
# 特殊メソッドの定義
class Human:
def __init__(self, name, age, phone_number):
self.name = name
self.age = age
self.phone_number = phone_number
# if文でインスタンスを条件に使用した際に、ここで設定した定義を元に真偽値を返す
def __bool__(self):
return True if self.age >= 20 else False
# 特殊メソッドの利用
man1 = Human('itiro', 30, '080-1111-2222')
man2 = Human('itiro',20,'080-1111-2222')
man3 = Human('Jiro',10,'080-1111-2222')
if man1:
print('man1 は20才以上')
if man2:
print('man2 は20才以上')
if man3:
print('man3 は20才以上')
# 出力結果
man1 は20才以上
man2 は20才以上
__len__
インスタンスにlen関数を実行した際に返す値を設定する。
今回は変数nameに指定した値を、len関数を実行した際に返すようにしている。
# 特殊メソッドの定義
class Human:
def __init__(self, name, age, phone_number):
self.name = name
self.age = age
self.phone_number = phone_number
# インスタンスにlen関数を実行した際に返す値を設定する
def __len__(self):
return len(self.name)
# 特殊メソッドの利用
man1 = Human('Itiro', 30, '080-1111-2222')
man2 = Human('Itir',20,'080-1111-2222')
man3 = Human('Jin',10,'080-1111-2222')
print(len(man1))
print(len(man2))
print(len(man3))
# 出力結果
5
4
3