2009-12-27 22 views

Respuesta

25

Como todos los métodos especiales (con "nombres de fantasía" que comienzan y terminan en __), __contains__ es no destinado a ser llamada directa (excepto en casos muy específicos, como arriba = llamadas a la superclase): en vez , tales métodos se llaman como parte de la operación de integradores y operadores. En el caso de __contains__, el operador en cuestión es in - el operador de "control de contención".

Con su clase a como lo presentan (a excepción de la fijación de su error tipográfico, y el uso de True en lugar de true -!), Y b como su ejemplo, print 'x' in b imprimirá True - y también lo hará cualquier otra comprobación de contención en b , dado que b siempre devuelve True (porque self.d, una cadena no vacía, es verdadera).

10

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 

El docs.

8
if self.d:return true 

self.d es la cadena 'ddd'. Las cadenas no vacías son siempre ciertas: cuando usa if en 'ddd', siempre actuará como si dijera if True:.

Creo que lo que probablemente quería decir es:

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

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

6

contiene método define cómo se comportan las instancias de la clase cuando aparecen en el lado derecho de adentro y no en el 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 
5

vamos a ver un ejemplo muy simple de método mágico __contains__:

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

Ahora bien, si quiero saber si mi obj1 (en este caso atributo name del obj1) contiene una cadena en particular, subcadena o un alfabeto, tengo que poner en práctica __contains__ método que se muestra en el ejemplo.

Si mi clase tiene __contains__ método puedo llamar a un operador incorporado en 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 
Cuestiones relacionadas