組み込み関数の1つ、bool()
引数として渡されたオブジェクトの真偽値を返却します。
中で何が起こっているか確認する
オブジェクトの真偽値はどうやって決まるのでしょうか?
公式リファレンスによると
https://docs.python.org/ja/3/library/stdtypes.html#truth
オブジェクトは、デフォルトでは真と判定されます。ただしそのクラスが
__bool__()
メソッドを定義していて、それが False を返す場合、または__len__()
メソッドを定義していて、それが 0 を返す場合は偽と判定されます。
だそうです。試してみます。
# __bool__() __len__()を定義している場合
>>> class Class1:
... def __bool__(self):
... print('__bool__が呼ばれたよ')
... return False
... def __len__(self):
... print('__len__が呼ばれたよ')
... return 0
...
>>> hoge = Class1()
>>> bool(hoge)
__bool__が呼ばれたよ
False
# __bool__()が定義されていない場合
>>> class Class2:
... def __len__(self):
... print('__len__が呼ばれたよ')
... return 0
...
>>> piyo = Class2()
>>> bool(piyo)
__len__が呼ばれたよ
False
# __bool__()__len__()が定義されていない場合
>>> class Class3():
... pass
>>> fuga = Class3()
# デフォルトどおり真が返る
>>> bool(fuga)
True
応用してみる
組み込み型のクラスであれば__bool__()
か__len__()
のどちらかは定義されています。
組み込み型を継承して自作クラスをつくる場合はこれらの特殊メソッドをオーバーライドできます。
例えば↓こんな感じ
# 通常のリストの場合、要素が1つ以上あれば真になる
>>> list = list([0])
>>> bool(list)
True
# 要素それぞれの真偽値判定をし、真になるものが1つ以上あれば真を返す
>>> class MyList(list):
... def __bool__(self):
... return any(self)
...
>>> my_list = MyList([0])
>>> bool(my_list)
False
bool()
の中で何が起こっているか理解していると、こういったアレンジができちゃいます。
(特殊メソッドをオーバーライドすると影響範囲が大きくなるので、やるときは慎重に!)