¿Qué hace __contains__, qué puede llamar a la función __contains__?

Aquí está mi código:

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 

Como todos los métodos especiales (con “nombres mágicos” que comienzan y terminan en __ ), __contains__ no debe llamarse directamente (excepto en casos muy específicos, como up = llamadas a la superclase): más bien, tales métodos se llaman como Parte de la operación de incorporados y operadores. En el caso de __contains__ , el operador en cuestión está in – el operador de “control de contención”.

Con su clase a como la presenta (excepto para corregir su error tipográfico, y usar True lugar de true ! -), y b como su instancia, la print 'x' in b imprimirá True – y también lo hará cualquier otra verificación de contención b , ya que b siempre devuelve True (porque self.d , una cadena no vacía, es verdadera).

Para obtener su código para hacer algo (aunque nada útil):

 class a(object): d = 'ddd' def __contains__(self, m): if self.d: return True b = a() >>> 'd' in b True 

Los docs .

 if self.d:return true 

self.d es la cadena 'ddd' . Las cadenas que no están vacías son siempre sinceras: cuando las usas if en 'ddd' siempre actuará como si hubieras dicho if True:

Creo que lo que quiso decir es:

 def __contains__(self, item): return item in self.d 

in es el operador que llama al método __contains__ detrás de escena.

__contains__ método __contains__ define cómo se comportan las instancias de la clase cuando aparecen en el lado derecho de in y not in operador.

 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 

Veamos un ejemplo muy simple de método mágico __contiene__ :

Supongamos que tengo un Player de clase y mi método __init__ toma un nombre de argumento de cadena. En main he creado un objeto ( obj1 ) de la clase Player.

Ahora, si quiero saber si mi obj1 (en este caso, el nombre de atributo de obj1) contiene una cadena, subcadena o un alfabeto en particular, debo implementar el método __contiene__ como se muestra en el ejemplo.

Si mi clase tiene el método __contains__ puedo llamar al operador incorporado en mis objetos personalizados como se muestra en el ejemplo.

  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