gpt4 book ai didi

python - 我怎样才能调用神奇的 `__contains__` 方法?

转载 作者:太空狗 更新时间:2023-10-30 02:10:33 25 4
gpt4 key购买 nike

我的 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

最佳答案

引用__contains__的文档,

Called to implement membership test operators. Should return true if item is in self, 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__()

所以,它会在与成员资格测试运算符一起使用时被调用,in,您应该这样使用它

print("hello" in hippo)

重要提示:Python 3.x 根本没有__getslice__ 特殊方法。引用 Python 3.0 Change log ,

__getslice__(), __setslice__() and __delslice__() were killed. The syntax a[i:j] now translates to a.__getitem__(slice(i, j)) (or __setitem__() or __delitem__(), when used as an assignment or deletion target, respectively).

因此,您不能使用切片语法调用它。


I am expecting to get True.

没有。您无法获得 True,因为您在成员资格测试之前已经调用了 hippo.capitalize()。因此,在进行成员资格测试时,您的 self._stringHELLO WORLD, 。所以,你实际上会得到 False

注意 1:在 Python 中, bool 值用 TrueFalse 表示。但是在您的 __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):]

您正在使用未定义的 ij。也许您想像这样使用 startend

def __getslice__(self, start, end):
return self[max(0, start):max(0, end):]

关于python - 我怎样才能调用神奇的 `__contains__` 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29292636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com