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 a
zoals u deze presenteert (behalve voor het corrigeren van uw typefout en het gebruik van True
in plaats van True
!-), en b
als instantie, print 'x' in b
zal True
afdrukken — en dat geldt ook voor elke andere inperkingscontrole op b
, aangezien b
altijd True
retourneert (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 in
en not in
operator.
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.d
is de tekenreeks 'ddd'
. Niet-lege strings zijn altijd waarheidsgetrouw: als je if
gebruikt 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
in
is 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