我知道python中有许多魔术方法会影响对象在某些情况下的行为方式(比如定义__cmp__(self, other)
以改变其与其他实例相比时的工作方式),但是我我想知道,有没有办法改变在'in'运算符中如何调用对象的行为?
if thing in custom_object:
call_the_object_in_a_customized_way()
有没有办法做到这一点?
答案 0 :(得分:7)
__contains__
是您正在寻找的方法
来自this page:
对于定义
__contains__()
方法的用户定义类,x in y
当且仅当y.__contains__(x)
为真时才为真。对于未定义
__contains__()
的用户定义的类,但确实如此 定义__iter__()
,如果某个值x in y
与z
相同,则x == z
为真 迭代y
时生成。如果在期间引发异常 迭代,就好像在提出异常。最后,尝试旧式迭代协议:如果一个类定义
__getitem__()
,x in y
为真,当且仅当存在非负整数索引i
使x == y[i]
和所有较低整数索引执行 不提出IndexError
例外。 (如果引发任何其他异常,则为 好像在提出异常)。
答案 1 :(得分:4)
为此定义函数__contains__
。当您使用in
运算符时调用它。
演示:
>>> class Test:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def __contains__(self, item):
return item in (self.a, self.c)
>>> a = Test(1, 2, 3)
>>> 1 in a
True
>>> 3 in a
True
>>> 2 in a
False