#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, похоже, в классе происходит немного больше, и он только сократил код, чтобы сузить точное место, где возникает проблема, я предположу, что у него есть свои причины сохранить его как класс.