重新定义 __and__ 运算符

7

为什么我无法重新定义__and__运算符?

class Cut(object):
      def __init__(self, cut):
         self.cut = cut
      def __and__(self, other):
         return Cut("(" + self.cut + ") && (" + other.cut + ")")

a = Cut("a>0") 
b = Cut("b>0")
c = a and b
print c.cut()

我想要 (a>0) && (b>0),但是我只得到了 b,这是 and 的通常行为。


应该写成 Cut(大写):b = cut("b>0") - joaquin
2个回答

14

__and__是二进制(按位)&运算符,而不是逻辑and运算符。

因为and运算符是一个短路运算符,所以它不能被实现为函数。也就是说,如果第一个参数为false,则根本不会评估第二个参数。如果尝试将其实现为函数,则必须在调用函数之前评估两个参数。


1
请注意,您可以通过提供更复杂的接口来允许带短路操作符的 and 进行重载。这已经被建议应用于 Python(http://www.python.org/dev/peps/pep-0335/),但目前还不受支持。 - Mike Graham
有趣,我还没有看到那个PEP。 - Ned Batchelder

1

2
根据这种奇怪的关键字和运算符的区分,重新定义in是不可能的。但是__contains()__是完全有效的... - glglgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接