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

nik*_*nik 17 python magic-methods getattr

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

我能得到a in b并且a is b以这样的方式?

Set*_*ton 25

因为in,正确的dunder方法是__contains__.

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


Dan*_* D. 15

in__contains__is没有dunder方法.我强烈建议你使用operator模块中的函数:

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)
Run Code Online (Sandbox Code Playgroud)

  • 我读`getattr(a,'__ lt __')(b)`要求`a <b`的函数版本是`operator.lt(a,b)`.你可以传递`operator.lt`.我没有看到你要定义dunder方法的类的定义. (3认同)