如何调用魔术`__contains__`方法?

时间:2015-03-27 03:07:32

标签: python python-3.x

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

2 个答案:

答案 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._stringHELLO WORLD,。所以,你实际上会得到False

注1:在Python中,布尔值用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):]

答案 1 :(得分:1)

您可以使用__contains__关键字

来调用in功能

喜欢

print "hello" in hippo