这是我的代码:
class a(object):
d='ddd'
def __contains__(self):
if self.d:return True
b=a()
print b.contains('d') # error
print contains(b,'d') # error
答案 0 :(得分:42)
与所有特殊方法一样(“魔术名称”以__
开头和结尾),__contains__
不意味着直接调用(非常特殊情况除外) ,例如up =对超类的调用):相反,这些方法被称为内置函数和运算符的操作的一部分。在__contains__
的情况下,相关运算符为in
- “包含检查”运算符。
在您提供课程a
时(除了修正拼写错误,并使用True
代替true
! - )和b
作为其实例, print 'x' in b
会打印True
- 因此b
上的任何其他遏制检查也会如此,因为b
始终会返回True
(因为self.d
,非空字符串,是真的。)
答案 1 :(得分:12)
让你的代码做一些事情(尽管没什么用处):
class a(object):
d = 'ddd'
def __contains__(self, m):
if self.d:
return True
b = a()
>>> 'd' in b
True
docs。
答案 2 :(得分:8)
if self.d:return true
self.d
是字符串'ddd'
。非空字符串总是真实的:当您在if
上使用'ddd'
时,它总是会像您说if True:
一样。
我认为你的意思是:
def __contains__(self, item):
return item in self.d
in
是在幕后调用__contains__
方法的运算符。
答案 3 :(得分:7)
__contains__
方法定义了类在in
和not in
运算符右侧出现时的行为方式。
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __contains__(self,param1):
return True if param1 in self.__dict__.keys() else False
>>> p = Person('Robby Krieger',23)
>>> 'name' in p
True
答案 4 :(得分:5)
让我们看一个非常简单的魔术方法示例 __包含__ :
假设我有类Player并且我的 __ init __ 方法接受一个字符串参数 name 。在main中,我创建了一个Player类的对象( obj1 )。
现在,如果我想知道我的 obj1 (在本例中是obj1的属性名称)是否包含特定字符串,子字符串或字母,我必须实现 __ contains __ 方法如示例所示。
如果我的班级有 __ contains __ 方法,我可以在自定义对象上调用内置运算符 ,如示例所示。
class Player():
def __init__(self, name):
self.name=name
def __contains__(self, substring):
if substring in self.name:
return True
else:
return False
obj1=Player("Sam")
print ('am' in obj1) ----> True
print ('ami' in obj1) ----> False