我有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()
另外,我在哪里可以了解有关魔术方法功能的更多信息?因为看起来我在调用函数时遇到的问题不仅仅是编写函数
答案 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__
方法试图实现的目标。