Почему я получаю сообщение об ошибке «Имя не определено» при вызове другой функции внутри класса?

#python

#python

Вопрос:

Функция tord должна принимать выходные данные из listsplit и выполнять действие над выводом. Поскольку я усек код для наглядности, выходные данные должны быть точно такими же, как выходные данные, если вы измените последнюю строку на print(listsplit(text)) , которая возвращает ['One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven'] вместо этого, всякий раз, когда я запускаю код, функция tword не вызывает функцию listsplit . Я получаю сообщение об ошибке: «Ошибка имени: имя ‘wordicts’ не определено».

 class wordicts:
    def listsplit(text):
        l = text.split(" ")
        return l
    def tword(text):
        l = wordicts.listsplit(text)
        return l

    hw = "One Two Three Four Five Six Seven"
    print(tword(hw))
  

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

1. Есть ли особая причина, по которой вы пытаетесь структурировать свой код таким образом? Какова ваша цель?

2. @DavidBuck, хороший вопрос.

Ответ №1:

Функции должны принадлежать экземпляру класса, обратите внимание на использование self аргумента в первой позиции:

 class WordDict:
    def listsplit(self, text):
        l = text.split(" ")
        return l
    def tword(self, text):
        l = self.listsplit(text)
        return l

hw = "One Two Three Four Five Six Seven"
wd = WordDict()
print(wd.tword(hw))
  

Однако, если вы не делаете с этим классом намного больше, это кажется излишеством, и вам лучше было бы использовать понимание списка или лямбды и т.д.

Ответ №2:

Прежде всего, ваши методы не принимают self параметр в качестве первого аргумента. Если вам не нужна ссылка на экземпляр класса, вам следует использовать @staticmethod декоратор.

Во-вторых, ваш вызов метода все еще находится внутри тела класса. Я не думаю, что это сделано специально. Это также причина, по которой возникает ошибка NameError. Часть print(wordicts.tword(hw)) выполняется во время определения класса, когда сам класс еще не существует.

Поскольку вы упомянули, что в реальном коде задействовано немного больше логики, я предполагаю, что у вас есть свои причины сохранить методы внутри класса. В этом случае вам следует попробовать следующее:

 class wordicts:
    @staticmethod
    def listsplit(text):
        l = text.split(" ")
        return l

    @staticmethod
    def tword(text):
        l = wordicts.listsplit(text)
        return l

hw = "One Two Three Four Five"
print(wordicts.tword(hw))
  

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

1. Это полностью противоречит цели существования класса, вы могли бы также просто определить listsplit и tword как обычные функции… или действительно, требуется только одна из этих функций. Хотя на самом деле это восходит к тому, почему OP структурирует свой код таким образом.

2. Вы, конечно, правы, если класс действительно содержит только эти два метода. Но, как заявил OP, похоже, в классе происходит немного больше, и он только сократил код, чтобы сузить точное место, где возникает проблема, я предположу, что у него есть свои причины сохранить его как класс.