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

时间:2013-12-18 13:01:21

标签: python methods

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

if thing in custom_object:
    call_the_object_in_a_customized_way()

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:7)

__contains__是您正在寻找的方法

来自this page

  

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

     

对于未定义__contains__()的用户定义的类,但确实如此   定义__iter__(),如果某个值x in yz相同,则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
相关问题