<p>在Python中没有<code>and</code>或<code>or</code>运算符的钩子,没有(因为它们短路),而且Python中也没有<code>xor</code>运算符。<code>__and__</code>和{<cd5>}分别用于<a href="https://docs.python.org/3/reference/expressions.html#unary-arithmetic-and-bitwise-operations" rel="noreferrer"><em>bitwise</em> ^{<cd6>} and ^{<cd7>} operators</a>。<code>not</code>的等价位运算符是<code>~</code>(反转),它由<a href="https://docs.python.org/3/reference/datamodel.html#object.__invert__" rel="noreferrer">^{<cd10>} method</a>处理,而<a href="https://docs.python.org/3/reference/datamodel.html#object.__xor__" rel="noreferrer">^{<cd11>}</a>覆盖了{<cd12>}位运算符。在</p>
<p><code>not</code>操作<a href="https://docs.python.org/3/library/stdtypes.html#truth-value-testing" rel="noreferrer"><em>truth-value</em> of an object</a>。如果你有一个容器,给它一个<a href="https://docs.python.org/3/reference/datamodel.html#object.__len__" rel="noreferrer">^{<cd14>} method</a>,如果没有,给它一个<a href="https://docs.python.org/3/reference/datamodel.html#object.__bool__" rel="noreferrer">^{<cd15>} method</a>。任何一个都会被咨询,以确定一个对象是否应该被认为是“true”;<code>not</code>反转该测试的结果。在</p>
<p>因此,如果<code>__bool__</code>返回<code>True</code>或<code>__len__</code>返回<code>0</code>以外的整数,<code>not</code>会将其转换为<code>False</code>,否则{<cd8>}生成{<cd18>}。请注意,您不能使<code>not</code>只返回布尔值!在</p>
<p>来自<code>__bool__</code>的文档:</p>
<blockquote>
<p><code>__bool__</code><br/>
Called to implement truth value testing and the built-in operation <code>bool()</code>; should return <code>False</code> or <code>True</code>. When this method is not defined, <code>__len__()</code> is called, if it is defined, and the object is considered true if its result is nonzero. If a class defines neither <code>__len__()</code> nor <code>__bool__()</code>, all its instances are considered true.></p>
</blockquote>
<p>对于<a href="https://docs.python.org/3/reference/expressions.html#boolean-operations" rel="noreferrer">^{<cd8>} expression</a>:</p>
<blockquote>
<p>In the context of Boolean operations, and also when expressions are used by control flow statements, the following values are interpreted as false: <code>False</code>, <code>None</code>, numeric zero of all types, and empty strings and containers (including strings, tuples, lists, dictionaries, sets and frozensets). All other values are interpreted as true. <strong>User-defined objects can customize their truth value by providing a <code>__bool__()</code> method.</strong></p>
<p>The operator <code>not</code> yields <code>True</code> if its argument is false, <code>False</code> otherwise.</p>
</blockquote>
<p><em>bold emphasis我的</em>。在</p>