【问题标题】:Is it possible to overload logical and in Python?是否可以在 Python 中重载逻辑和?
【发布时间】:2015-08-31 12:39:44
【问题描述】:

我的印象是在 Python 中可以重载 and,但是通过刚才阅读的文档,我意识到 __and__ 指的是按位的 & 运算符,而不是逻辑上的 and。

我是否忽略了某些东西,或者无法在 Python 中重载逻辑 and?

【问题讨论】:

  • 我很好奇:你想让一个重载的and 做什么?还是您只是出于纯粹的理论原因?
  • 纯理论。我正在写一些需要使用 Python AST 的东西。对于像Add 这样的大多数事情,我将其替换为对__add__ 的调用,但令我惊讶的是我找不到一个函数来替换AST 中的And 节点。
  • 我看不出你为什么要为与评估 __bool__ 的行为不匹配的逻辑运算符引入自定义行为的充分理由。

标签: python operator-overloading logical-operators


【解决方案1】:

不,这是不可能的。有一个 proposal 添加了这个功能,但现在被拒绝了。

【讨论】:

    【解决方案2】:

    不,这是不可能的。见here。

    【讨论】:

    • 嗯。 is 对我来说有些道理,但我很惊讶 and 和 or 不能重载。
    • 是的,确实是语言的限制。但是您可以覆盖按位运算符 & 和 | ,正如你所注意到的。这被例如使用。 SQLAlchemy,当然你也可以自己使用。
    【解决方案3】:

    没有直接的方法可以做到这一点。您可以为您的对象覆盖 __nonzero__ 以修改其真值。

    class Truth:
    
        def __init__(self, truth):
            self.truth = truth
    
        def __nonzero__(self):
            return self.truth
    
    t = Truth(True)
    f = Truth(False)
    
    print bool(t and t)
    print bool(t and f)
    print bool(f and f)
    

    【讨论】:

    • 兼容性提示:__nonzero__ 在 3.X 中已重命名为 __bool__。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2012-06-16
    • 2014-08-16
    相关资源
    最近更新 更多