Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python“;“魔术法”;用于自定义in运算符的行为_Python_Methods - Fatal编程技术网

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

Python“;“魔术法”;用于自定义in运算符的行为,python,methods,Python,Methods,我知道python中有许多神奇的方法可以影响对象在某些情况下的行为方式(比如定义\uuu cmp\uuu(self,other)来改变它与自身的另一个实例相比的工作方式),但我想知道,有没有办法改变在“in”操作符中调用对象的方式 if thing in custom_object: call_the_object_in_a_customized_way() 有什么方法可以做到这一点吗?是您正在寻找的方法 发件人: 对于定义\uuuu contains\uuuu()方法的用户定义类,y

我知道python中有许多神奇的方法可以影响对象在某些情况下的行为方式(比如定义
\uuu cmp\uuu(self,other)
来改变它与自身的另一个实例相比的工作方式),但我想知道,有没有办法改变在“in”操作符中调用对象的方式

if thing in custom_object:
    call_the_object_in_a_customized_way()
有什么方法可以做到这一点吗?

是您正在寻找的方法

发件人:

对于定义
\uuuu contains\uuuu()方法的用户定义类,
y中的x
当且仅当
y时为真

对于不定义
的用户定义类,它包含
,但包含
定义
\uu iter\uu()
,如果使用
x==z
的某个值
z
为 在
y
上迭代时生成。如果在测试过程中引发异常 迭代,就好像在中引发了那个异常

最后,尝试旧式的迭代协议:如果类定义
\uuu getitem\uuu()
y中的x
为真,当且仅当存在一个非负整数索引
i
,使得
x==y[i]
,且所有较低的整数索引都为真 未引发索引器异常。(如果提出任何其他例外情况,则 就好像提出了那个例外)

为此定义函数。当您在
操作符中使用
时会调用它

演示:


谢谢,这帮了大忙!
>>> 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