では、なぜこれらの演算子は論理オペランドを受け入れるのでしょうか。
bool
サブクラス、およびオペランドを返すためのint
オーバーライドなど。__and__()
bool
bool
詳細については、PEP285を参照してください。
具体的には:
6)boolはintから継承する必要がありますか?
=>はい
理想的な世界では、boolは
混合モードの実行方法を知っている個別の整数型
算術。ただし、intからboolを継承すると、
実装が非常に大きい(部分的には、を呼び出すすべてのCコードが
PyInt_Check()は引き続き機能します-これはtrueを返します
intのサブクラス)。また、これは正しいと思います
代替可能性:intを必要とするコードにブール値を与えることができます
0または1と同じように動作します。
intが指定されている場合、boolは機能しない可能性があります。たとえば、3&4
は0ですが、真理と見なすと3と4の両方が真になります
値。
と
class bool(int):
def __and__(self, other):
if isinstance(other, bool):
return bool(int(self) & int(other))
else:
return int.__and__(self, other)
__rand__ = __and__
def __or__(self, other):
if isinstance(other, bool):
return bool(int(self) | int(other))
else:
return int.__or__(self, other)
__ror__ = __or__
def __xor__(self, other):
if isinstance(other, bool):
return bool(int(self) ^ int(other))
else:
return int.__xor__(self, other)
__rxor__ = __xor__
一方、inheritの動作をbool & bool
返す方法に注意してください(つまり、を返します)。bool
bool & non-bool
int
int
これらのプロパティを示すいくつかの例を次に示します。
In [12]: isinstance(True, int)
Out[12]: True
In [13]: True & True
Out[13]: True
In [14]: True & 1
Out[14]: 1
上記の動作は、算術演算子には適用されません。それらは単にint
の振る舞いを使用します:
In [15]: True + 0
Out[15]: 1
In [16]: True + False
Out[16]: 1