【问题标题】:Any way to override the and operator in Python?有什么方法可以覆盖 Python 中的 and 运算符?
【发布时间】:2009-01-23 01:36:42
【问题描述】:

我尝试覆盖 __and__,但这是针对 & 运算符,而不是 and - 我想要的那个。我可以覆盖吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    不,您不能覆盖 andor。由于它们在 Python 中的行为(即短路),它们更像是控制流工具而不是运算符,并且覆盖它们更像是覆盖 if 而不是 + 或 -。

    可以通过覆盖 __nonzero__(或 Python 3 中的 __bool__)来影响对象的真值(即它们评估为真还是假)。

    【讨论】:

    • 控制流(右手边的惰性求值)语义仍然可以通过将重载作为二元运算符来维持,其中右手边作为可调用而不是作为值传递。跨度>
    • @DRayX 甚至没有必要。短路部分可以简单地保留为运算符的一部分,并且假设的 __and2__ 函数只有在第一个参数的计算结果为真值时才会被调用。 a and b 将等同于 a.__and2__(b) if a else a。不像其他运算符函数那样常规,但该选择将强制保留短路并提供更好的性能。
    【解决方案2】:

    您不能覆盖 andornot 布尔运算符。

    【讨论】:

    • 值得注意的是,PEP335 提出了一个建议,最终被拒绝了。
    【解决方案3】:

    虽然您不能重载__and__,但您可以使用infix 来重载and。在这种情况下,您将使用 &and& 来表示 and 运算符。

    【讨论】:

    • 不,你不能。 (因为and 是 Python 中的关键字。)
    【解决方案4】:

    不是真的。短路逻辑运算符没有特殊的方法名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-22
      • 2014-10-16
      • 1970-01-01
      • 2011-07-02
      • 2011-07-14
      • 2010-11-14
      • 2011-01-02
      相关资源
      最近更新 更多