What does __contains__ do, what can call __contains__ function
Solution 1:
Like all special methods (with "magic names" that begin and end in __
), __contains__
is not meant to be called directly (except in very specific cases, such as up=calls to the superclass): rather, such methods are called as part of the operation of built-ins and operators. In the case of __contains__
, the operator in question is in
-- the "containment check" operator.
With your class a
as you present it (except for fixing your typo, and using True
instead of true
!-), and b
as its instance, print 'x' in b
will print True
-- and so will any other containment check on b
, since b
always returns True
(because self.d
, a non-empty string, is true).
Solution 2:
to get your code to do something (although nothing useful):
class a(object):
d = 'ddd'
def __contains__(self, m):
if self.d:
return True
b = a()
>>> 'd' in b
True
The docs.
Solution 3:
__contains__
method defines how instances of class behave when they appear at right side of in
and 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
Solution 4:
if self.d:return true
self.d
is the string 'ddd'
. Non-empty strings are always truthy: when you use if
on 'ddd'
it will always act as if you'd said if True:
.
I think what you probably meant is:
def __contains__(self, item):
return item in self.d
in
is the operator that calls the __contains__
method behind the scenes.
Solution 5:
Lets see a very simple example of magic method __contains__ :
Suppose I have class Player and my __init__ method takes one string argument name. In main I have created an object (obj1) of class Player.
Now if I want to know if my obj1 (in this case attribute name of obj1) contains a particular string, substring or an alphabet, I have to implement __contains__ method as shown in the example.
If my class has __contains__ method I can call built-in operator in on my custom objects as shown in the example.
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