#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. Пожалуйста, в будущем используйте отступ в четыре пробела, чтобы нам было легче читать ваш код. Я не уверен, в чем ваша проблема на данный момент; вы, кажется, решили ее. Эта функция должна быть вне класса, статический метод, или вам нужно перепроектировать класс. Почему это не может быть вне класса, а вместо
c
,return c
тогда doc = func()
вместоc = Name...
andc.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: храните свои именные объекты в списке.