操作符“is”和“in”的魔术方法名称是什么?

时间:2016-12-05 18:17:40

标签: python magic-methods getattr

我想使用这些运算符的魔术方法进行bool二进制运算。例如,我可以将a < b作为getattr(a, '__lt__')(b)a == b作为getattr(a, '__eq__')(b)

我能以这种方式获得a in ba is b吗?

3 个答案:

答案 0 :(得分:26)

对于in,正确的dunder方法是__contains__

is没有方法,因为这相当于id(a) == id(b)。它比较了Python下使用的实际对象ID,因此用于比较对象标识,而不是对象内容。在类中覆盖它会破坏Python的对象模型,所以不允许这样做。

答案 1 :(得分:16)

in__contains__is没有dunder方法。我强烈建议您使用operator module中的函数:

a < b  => operator.lt(a, b)
a == b => operator.eq(a, b)
a in b => operator.contains(a, b)
a is b => operator.is_(a, b)

答案 2 :(得分:1)

__contains__对于in是正确的,如果__contains__未定义为__iter____getitem__,则为后备选项。

我不确定为什么你需要getattr用于is; {em>为 Python中的每个对象“定义”is。无需通过operator._is或{尝试和失败)通过getattr

See the documentation on built-in types

  

isis not运营商的行为无法自定义;还它们可以应用于任何两个对象,并且永远不会引发异常。

(强调我的)

根据您提供的片段,只需抓取一个函数并使用getattr(a, "function")(b)调用它,您已经拥有了需要评估的对象的名称,只需立即使用is;它总是可用的。