__getslice__你如何在函数中调用它

时间:2015-03-27 03:50:49

标签: python python-3.x

我有class Sentence魔法方法函数__getslice__

我不明白如何调用该函数?

我正在尝试切片。所以例如如果字符串是"HELLO WORLD, james",并且我将它切片为[0:1],我希望得到"HELLO"

我得到了这个错误:'method' object is not subscriptable

这是我的代码:

    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 self._string[k]
        def __len__(self):
            return self._String
        def __getslice__(self, start, end):
            return self[max(0, start):max(0, end):]
        def __add__(self, other):
            self._string = self._string + other
            return self._string
        def __frequencyTable__(self, word):
            count = 0
            for w in self._string:
                if self._string.has_key(word):
                    count = count + 1
            return count
        def __contains__(self, word):
            return word in self._string


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("HELLO" in hippo)           ##contains

    print(hippo.__getitem__(0))      ##__getitem

    print(hippo.__add__("james"))      ##__add__

    print(hippo.__getslice__[0:1])



functionTesting()

另外,我在哪里可以了解有关魔术方法功能的更多信息?因为看起来我在调用函数时遇到的问题不仅仅是编写函数

2 个答案:

答案 0 :(得分:5)

__getslice__()在Python 2.6中已被弃用,并在Python 3中被删除。您应该使用__getitem__(),它将在使用切片表示法调用时接收切片对象。

def __getitem__(self, k):
    if isinstance(k, slice):
        # do slice stuff here
    return self._string[k]

您可以参考datamodel documentation了解所有魔术方法的详细信息。

答案 1 :(得分:4)

执行hippo.__getslice__[0:1]时,您实际上正在尝试对方法hippo.__getslice__进行切片。这就是它失败的原因

'method' object is not subscriptable

重要说明: __getslice__自Python 2.0以来已弃用,但在Python 3.x中不可用。引用官方documentation of __getslice__

  

自2.0版以来不推荐使用:支持切片对象作为__getitem__()方法的参数。 (但是,CPython中的内置类型目前仍然实现__getslice__()。因此,在实现切片时必须在派生类中重写它。)

所以你应该使用__getitem__进行切片。引用这个问题,

  

例如,如果字符串是" HELLO WORLD,james" ,我在[0:1]切片,我希望得到" HELLO"

由于您希望通过切片获取单词,如果传递给__getitem__的键是slice对象,则调用self.getWords()并对返回的对象进行切片,如下所示

def __getitem__(self, k):
    if isinstance(k, slice):
        return self.getWords()[k]
    return self._string[k]

....
print(hippo[0:1])
['HELLO']

注1:在订阅__getitem__对象时,您不必显式调用hippo。你可以简单地做

print(hippo[0])
# H

这将在__getitem__内部调用k作为0

注2:与上一个相同。您不必显式调用__add__,并且可以使用算术运算符+隐式调用,就像这样

print(hippo + "james")
# HELLO WORLD, james

注3:__frequenceTable__实现中,您在字符串上使用has_key方法(which is a deprecated dictionary method。因此,在运行时,您的程序将失败与

AttributeError: 'str' object has no attribute 'has_key'

也许您打算使用in运算符。

def __frequencyTable__(self, word):
    count = 0
    for w in self._string:
        if word in self._string:
            count = count + 1
    return count

PS:我不确定这个__frequencyTable__方法试图实现的目标。