2015-03-27 2 views
2

У меня есть class Sentence с волшебной функцией метода __getslice____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() 

Также где я могу узнать больше о функциях магического метода? Как мне кажется, мне сложно называть функции больше, чем писать их

ответ

4

Когда вы делаете hippo.__getslice__[0:1], вы на самом деле пытаетесь нарезать метод hippo.__getslice__. Вот почему это происходит сбой с ошибкой

'method' object is not subscriptable 

Важное примечание:__getslice__ является устаревшим, так как Python 2.0 и он не доступен в Python 3.x. Цитируя официальный documentation of __getslice__,

Deprecated since version 2.0: Support slice objects as parameters to the __getitem__() method. (However, built-in types in CPython currently still implement __getslice__() . Therefore, you have to override it in derived classes when implementing slicing.)

Таким образом, вы должны использовать __getitem__ для нарезания. Цитирование вопроса,

for example if the string is "HELLO WORLD, james" , and I slice it at [0:1] , I expect to get "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__ пытается достичь.

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 Подробную информацию о всех магических методов.

Смежные вопросы