Wat doet __contains__, wat kan de functie __contains__ aanroepen

Hier is mijn code:

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

Antwoord 1, autoriteit 100%

Zoals alle speciale methoden (met “magische namen” die beginnen en eindigen op __), __contains__is nietbedoeld om rechtstreeks te worden aangeroepen (behalve in zeer specifieke gevallen, zoals up=calls to de superklasse): in plaats daarvan worden dergelijke methoden aangeroepen als onderdeel van de werking van ingebouwde ins en operators. In het geval van __contains__, is de operator in kwestie in— de “containment check”-operator.

Met uw klasse azoals u deze presenteert (behalve voor het corrigeren van uw typefout en het gebruik van Truein plaats van True!-), en bals instantie, print 'x' in bzal Trueafdrukken — en dat geldt ook voor elke andere inperkingscontrole op b, aangezien baltijd Trueretourneert (omdat self.d, een niet-lege tekenreeks, waar is).


Antwoord 2, autoriteit 28%

om uw code iets te laten doen (hoewel niets nuttigs):

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

De docs.


Antwoord 3, autoriteit 21%

__contains__methode definieert hoe instanties van klasse zich gedragen wanneer ze verschijnen aan de rechterkant van inen not inoperator.

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  

Antwoord 4, autoriteit 11%

if self.d:return true

self.dis de tekenreeks 'ddd'. Niet-lege strings zijn altijd waarheidsgetrouw: als je ifgebruikt op 'ddd', zal het altijd doen alsof je if True:hebt gezegd .

Ik denk dat je waarschijnlijk bedoelde:

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

inis de operator die achter de schermen de methode __contains__aanroept.


Antwoord 5, autoriteit 9%

Laten we een heel eenvoudig voorbeeld van de magische methode bekijken __contains__:

Stel dat ik klasse Player heb en mijn __init__methode heeft één stringargument naamnodig. In het algemeen heb ik een object (obj1) van klasse Player gemaakt.

Als ik nu wil weten of mijn obj1(in dit geval attribuutnaam obj1) een bepaalde string, substring of een alfabet bevat, moet ik __contains__implementeren methode zoals getoond in het voorbeeld.

Als mijn klas de methode __contains__heeft, kan ik de ingebouwde operator inop mijn aangepaste objecten aanroepen, zoals in het voorbeeld wordt getoond.

  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

Other episodes