класс palindrome — ошибка имени: имя ‘is_palindrome’ не определено

#python #class #palindrome

#python #класс #палиндром

Вопрос:

Я получаю ошибку

«Ошибка имени: имя ‘is_palindrome’ не определено»

Я нашел эту простую проблему на веб-сайте, который просит создать класс с именем Palindrome и внутри него функцию с именем is_palindrome для проверки заданного слова и возврата, True если это palindrome, а False в противном случае это должно быть сделано с использованием класса и статического метода (поэтому я не могу их удалить), код приведен ниже.

 class Palindrome:
    @staticmethod
    def is_palindrome(s):
        return len(s) < 2 or s[0] == s[-1] and is_palindrome(s[1:-1])

word = input()
print(Palindrome.is_palindrome(word))
  

Я решил вопрос, удалив объявление класса
другие методы, такие как

 return word==word[::-1]
  

но я пытаюсь понять проблему с приведенным выше кодом, почему, когда я включаю его в класс, я получаю эту ошибку

«Ошибка имени: имя ‘is_palindrome’ не определено»

Комментарии:

1. return len(s) < 2 or s[0] == s[-1] and is_palindrome(s[1:-1]) выглядит потрясающе

2. Я действительно не знаю, какие преимущества дает использование статического метода в классе, а не просто функции.

3. @RobinZigmond как я сказал в вопросе, класс и статический метод были объявлены самим сайтом, я не могу его удалить (и если я это сделаю, это сработает), поэтому я пытаюсь понять, почему это не работает, когда оно включено в класс

4. @DirtyBit Я знаю об отступах в Python, поэтому я уверен, что код имеет правильный отступ (если вы видите что-то неправильное, пожалуйста, скажите мне, в какой строке)

5. @DirtyBit на самом деле это просто проверяет, меньше ли длина мира 2 (что по умолчанию является палиндромом), и если это > 2, то проверьте 1-й символ и последний символ, равны ли они или нет (и продолжайте нарезать его, пока его длина не станет меньше 2)

Ответ №1:

Хотя я не понимаю, как метод в классе или являющийся статическим, помогает, но вот исправление:

 class Palindrome:
    @staticmethod
    def is_palindrome(s):
        return len(s) < 2 or s[0] == s[-1] and Palindrome.is_palindrome(s[1:-1])

word = input("Enter your word: ")
print(Palindrome.is_palindrome(word))
  

ВЫВОД:

 Enter your word: ROTAVATOR
True
  

Редактировать:

Если вы не хотите запутываться в классе, предполагая, что вы больше ничего не делаете:

 def is_palindrome(s):
    return len(s) < 2 or s[0] == s[-1] and is_palindrome(s[1:-1])

word = input("Enter your word: ")
print(is_palindrome(word))
  

ПРАВКА 3:

Другой способ:

 class Palindrome:
    def is_palindrome(self, s):
        return len(s) < 2 or s[0] == s[-1] and self.is_palindrome(s[1:-1])

word = input("Enter your word: ")
p_Obj = Palindrome()
print(p_Obj.is_palindrome(word))
  

Комментарии:

1. понимаю ли я из вашего решения (которое сработало), что я не могу напрямую вызвать метод, который я создал внутри класса, но я должен использовать class_name.method?

2. и класс, и статический метод бесполезны, он уже был объявлен самим сайтом

3. @Serilena удалите статический метод, создайте объект класса, вызовите метод с этим объектом, передайте self в метод is_palindrome() , и он также должен работать.

4. @Serilena пожалуйста, проверьте правку 3, и если это помогло, вы можете принять ответ: meta.stackexchange.com/questions/5234 /… приветствия

5. первое решение фактически решает проблему, спасибо.

Ответ №2:

Нет необходимости в классе Palindrome. Просто имейте

 def is_palindrome(s):
    return len(s) < 2 or s[0] == s[-1] and is_palindrome(s[1:-1])
  

Комментарии:

1. как я уже говорил в своем вопросе, это сработало, когда я удалил класс, но я хочу понять, почему это не работает, когда я включаю его в класс, но все равно спасибо