Получение сообщения об ошибке при попытке присоединить класс к объекту

#python #class #methods

#python #класс #методы

Вопрос:

у меня небольшая проблема, когда я пытаюсь присоединить класс к объекту в python. У меня есть текстовый файл ‘file’, который разделен на список для каждой строки. Программа прочитает каждую строку и выведет имя и длинное имя. Представьте, что текстовый файл выглядит следующим образом:

«Джон ‘ n’ Джон Траволта» (…)

Вот мой фрагмент кода:

 class Name:
  def __init__(self, name, longname):
   self.name=name
   self.longname=longname
  def __str__(self):
   s="Name:" self.name
   s ="n Longname:" self.longname
  def func():
   for line in file:
       name=line[:1]
       longname=line['n':]
c=Name(name, longname)
c.func()
  

Я получаю сообщение об ошибке, что мои ‘name’ и ‘longname’ не определены, но я сделал это со своей функцией ??? 🙁

Это работает, если я помещаю функцию вне класса, например:

 def func():
 for line in file:
  name=line[:1]
  longname=line['n':]
  c=Name(name, longname)
  print c
  

Нужна помощь!

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

1. я предполагаю, когда вы говорите 'name' and 'shortname' is not defined , что имеете в виду это name и longname не определены.

2. да, я имею в виду «длинное имя». да, проблема с домашним заданием, и это даже не настоящая проблема, я просто пытаюсь объяснить проблему в моей программе на примере

3. Пожалуйста, в будущем используйте отступ в четыре пробела, чтобы нам было легче читать ваш код. Я не уверен, в чем ваша проблема на данный момент; вы, кажется, решили ее. Эта функция должна быть вне класса, статический метод, или вам нужно перепроектировать класс. Почему это не может быть вне класса, а вместо print ing c , return c тогда do c = func() вместо c = Name... and c.func() ?

4. Я попытался вернуть c, а затем выполнить c = func() и c.func , но там просто сказано, что ‘Name’ не является атрибутом для func(), что, я думаю, имеет смысл, потому что func находится вне класса. Спасибо за помощь, хотя,

Ответ №1:

Вам нужно назначить что-то для name и longname, прежде чем вы сможете их использовать:

 name = 'foo'
longname = 'foo bar'
c=Name(name, longname)
c.func()
  

но я сделал это со своей функцией?

Нет.

  • Во-первых, вы еще не вызывали свою функцию. Вызов функции выполняется после строки, которая выдает ошибку.
  • Во-вторых, функция имеет свою собственную область видимости. name Там отличается от глобального name .

Я не думаю, что имеет смысл перемещать ваш func метод внутри определения класса. Код, который, по вашим словам, работает, является лучшим способом сделать это.

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

1. Да, я понимаю, что вы имеете в виду, но проблема в том, что я не знаю, какое имя и длинное имя b4 функция прочитала мой текстовый файл. Хотя представьте, что мне придется позже использовать имена и длинные имена для каждого пользователя — что я могу тогда сделать? вернуть c в конце моей функции?

2. @John: храните свои именные объекты в списке.