我的Sentence类中有contains方法,用于检查单词是否在句子中(在我的情况下是字符串)
我试图检查functionTesting
hello
hello world
中是否存在AttributeError: 'Sentence' object has no attribute 'contains'
而我收到此错误:
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()
这是我的代码
__contains__
如何调用functionTesting
函数?我是否在类方法函数中犯了错误,或者在调用它时在True
中犯了错误?我期待得到{{1}}。
答案 0 :(得分:7)
引用__contains__
,
被调用以实现成员资格测试运营商。如果
item
位于self
,则应返回true,否则返回false。对于映射对象,这应该考虑映射的键而不是值或键 - 项对。对于未定义
尝试旧的序列迭代协议__contains__()
的对象,成员资格测试首先通过__iter__()
尝试迭代,然后通过__getitem__()
因此,当与成员资格测试运算符in
一起使用时,它将被调用,你应该像这样使用它
print("hello" in hippo)
重要提示: Python 3.x,根本没有__getslice__
特殊方法。引用Python 3.0 Change log,
__getslice__()
,__setslice__()
和__delslice__()
被杀。语法a[i:j]
现在转换为a.__getitem__(slice(i, j))
(或__setitem__()
或__delitem__()
,分别用作转让或删除目标时。)
因此,您无法使用切片语法调用它。
我期待得到真实。
没有。您无法获得True
,因为您在成员资格测试之前已经调用了hippo.capitalize()
。因此,在成员资格测试发生时,您的self._string
为HELLO WORLD,
。所以,你实际上会得到False
。
注1:在Python中,布尔值用True
和False
表示。但是在__contains__
函数中,您将返回true
,这将在运行时引发NameError
。你可以更简洁地写这个
def __contains__(self, word):
return word in self._string
注2:同样在您的__getslice__
功能
def __getslice__(self, start, end):
return self[max(0, i):max(0, j):]
您正在使用未定义的i
和j
。也许你想像这样使用start
和end
def __getslice__(self, start, end):
return self[max(0, start):max(0, end):]
答案 1 :(得分:1)
您可以使用__contains__
关键字
in
功能
喜欢
print "hello" in hippo