__contains__做了什么,可以调用__contains__函数

时间:2009-12-27 01:49:03

标签: python

这是我的代码:

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

5 个答案:

答案 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__方法定义了类在innot 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