2009-12-27 41 views

risposta

25

Come tutti i metodi speciali (con "nomi magici" che iniziano e finiscono in __), __contains__ è non destinate ad essere chiamato direttamente (se non in casi molto specifici, come fino = chiamate alla superclasse): piuttosto tali metodi sono chiamati come parte dell'operazione di built-in e operatori. Nel caso di __contains__, l'operatore in questione è in - l'operatore "controllo di contenimento".

con la classe a come lo si presenti (tranne che per fissare il vostro errore di battitura, e l'utilizzo di True invece di true -!), E b come il suo esempio, print 'x' in b stamperà True - e così sarà ogni altro controllo di contenimento su b , dal b restituisce sempre True (perché self.d, una stringa non vuota, è vero).

10

per ottenere il codice di fare qualcosa (anche se nulla di utile):

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

>>> 'd' in b 
True 

Il docs.

8
if self.d:return true 

self.d è la stringa 'ddd'. Le stringhe non vuote sono sempre veritiere: quando si utilizza if su 'ddd', si comporterà sempre come se avessi detto if True:.

Penso che quello che probabilmente è dire:

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

in è l'operatore che chiama il metodo __contains__ dietro le quinte.

6

contiene il metodo definisce come si comportano le classi di classe quando appaiono al lato destro di in e non in operatore.

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

Vediamo un esempio molto semplice di metodo magico __contains__:

Supponiamo che io sono di classe Player e il mio metodo __init__ prende un argomento stringa nome. Nel main ho creato un oggetto (obj1) di classe Player.

Ora, se voglio sapere se il mio obj1 (in questo caso attributo name del obj1) contiene una particolare stringa, sottostringa o di un alfabeto, devo implementare __contains__ metodo, come mostrato nell'esempio.

Se la mia classe ha __contains__ metodo posso chiamare di operatore incorporato in sui miei oggetti personalizzati come mostrato nell'esempio.

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 
Problemi correlati