Python"魔术方法",用于自定义in运算符的行为

use*_*473 0 python methods

我知道python中有许多魔术方法会影响对象在某些情况下的行为方式(比如定义__cmp__(self, other)改变它与其他实例相比时的工作方式),但我想知道,有没有办法让改变在'in'运算符中如何调用对象的行为?

if thing in custom_object:
    call_the_object_in_a_customized_way()
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Eri*_*ric 7

__contains__ 是你正在寻找的方法

从这个页面:

对于定义__contains__()方法的用户定义类,x in y当且仅当y.__contains__(x)为true 时为true.

对于不定义用户定义的类__contains__(),但不限定__iter__(),x in y如果一些值为true z与x == z同时迭代产生y.如果在迭代期间引发异常,则就好像在异常中引发异常一样.

最后,旧式迭代协议尝试:如果一个类定义 __getitem__(),x in y是真,当且仅当有一个非负整数索引i这样x == y[i],并且所有的整数索引不提高IndexError例外.(如果引发任何其他异常,那就好像在提出异常时).