我想使用这些运算符的魔术方法进行bool二进制运算。例如,我可以将a < b
作为getattr(a, '__lt__')(b)
或a == b
作为getattr(a, '__eq__')(b)
。
我能以这种方式获得a in b
和a is b
吗?
答案 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 :
is
和is not
运营商的行为无法自定义;还它们可以应用于任何两个对象,并且永远不会引发异常。
(强调我的)
根据您提供的片段,只需抓取一个函数并使用getattr(a, "function")(b)
调用它,您已经拥有了需要评估的对象的名称,只需立即使用is
;它总是可用的。