I have the contains method in my Sentence class that checks if a word is in a sentence(string in my case)
I tried to check in my functionTesting
if hello
exist in hello world
and I got this error instead:
AttributeError: 'Sentence' object has no attribute 'contains'
here is my code
class Sentence:
def __init__(self, string):
self._string = string
def getSentence(self):
return self._string
def getWords(self):
return self._string.split()
def getLength(self):
return len(self._string)
def getNumWords(self):
return len(self._string.split())
def capitalize(self):
self._string = self._string.upper()
def punctation(self):
self._string = self._string + ", "
def __str__(self):
return self._string
def __getitem__(self, k):
return k
def __len__(self):
return self._String
def __getslice__(self, start, end):
return self[max(0, i):max(0, j):]
def __add__(self, other):
self._string = self._string + other._string
return self._string
def __frequencyTable__(self):
return 0
def __contains__(self, word):
if word in self._string:
return True # contains function!!##
def functionTesting():
hippo = Sentence("hello world")
print(hippo.getSentence())
print(hippo.getLength())
print(hippo.getNumWords())
print(hippo.getWords())
hippo.capitalize()
hippo.punctation()
print(hippo.getSentence())
print(hippo.contains("hello"))
functionTesting()
How do you call the __contains__
function? Did I make a mistake in the class method function or did I make a mistake in the functionTesting
when calling it? I am expecting to get True
.
Quoting the documentation of __contains__
,
Called to implement membership test operators. Should return true if
item
is inself
, false otherwise. For mapping objects, this should consider the keys of the mapping rather than the values or the key-item pairs.For objects that don’t define
__contains__()
, the membership test first tries iteration via__iter__()
, then the old sequence iteration protocol via__getitem__()
So, it will be invoked when used with the membership testing operator, in
, and you should use it like this
print("hello" in hippo)
Important Note: Python 3.x, doesn't have __getslice__
special method at all. Quoting Python 3.0 Change log,
__getslice__()
,__setslice__()
and__delslice__()
were killed. The syntaxa[i:j]
now translates toa.__getitem__(slice(i, j))
(or__setitem__()
or__delitem__()
, when used as an assignment or deletion target, respectively).
So, you cannot invoke it with the slicing syntax.
I am expecting to get True.
No. You cannot get True
, because you already called hippo.capitalize()
before the membership test. So, your self._string
is HELLO WORLD,
by the time membership test is happening. So, you will actually get False
.
Note 1: In Python, boolean values are represented with True
and False
. But in your __contains__
function you are returning true
which will raise NameError
at runtime. You can better write it succinctly like this
def __contains__(self, word):
return word in self._string
Note 2: Also in your __getslice__
function,
def __getslice__(self, start, end):
return self[max(0, i):max(0, j):]
you are using i
and j
which are not defined. Perhaps you wanted to use start
and end
like this
def __getslice__(self, start, end):
return self[max(0, start):max(0, end):]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With