Вызов функции класса внутри __init__
Я пишу код, который принимает имя файла, открывает файл и анализирует некоторые данные. Я бы хотел сделать это в классе. Работает следующий код:
class MyClass():
def __init__(self, filename):
self.filename = filename
self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None
def parse_file():
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5
parse_file()
Но это связано с тем, что я помещаю все механизмы синтаксического анализа в рамки функции __init__
для моего класса. Теперь это выглядит отлично для этого упрощенного кода, но функция parse_file
также имеет несколько уровней отступов. Я бы предпочел определить функцию parse_file()
как функцию класса, как показано ниже:
class MyClass():
def __init__(self, filename):
self.filename = filename
self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None
parse_file()
def parse_file():
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5
Конечно, этот код не работает, потому что функция parse_file()
не входит в область функции __init__
. Есть ли способ вызвать функцию класса из __init__
этого класса? Или я думаю об этом неправильно?
Ответы
Ответ 1
Вызвать функцию следующим образом:
self.parse_file()
Вам также необходимо определить вашу функцию parse_file() следующим образом:
def parse_file(self):
Метод parse_file
должен быть привязан к объекту при его вызове (потому что это не статический метод). Это делается путем вызова функции в экземпляре объекта, в вашем случае экземпляр self
.
Ответ 2
Если я не ошибаюсь, обе функции являются частью вашего класса, вы должны использовать его следующим образом:
class MyClass():
def __init__(self, filename):
self.filename = filename
self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None
self.parse_file()
def parse_file(self):
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5
замените строку:
parse_file()
с:
self.parse_file()
Ответ 3
Как насчет:
class MyClass(object):
def __init__(self, filename):
self.filename = filename
self.stats = parse_file(filename)
def parse_file(filename):
#do some parsing
return results_from_parse
Кстати, если у вас есть переменные с именем stat1
, stat2
и т.д., ситуация попросит кортеж:
stats = (...)
.
Итак, пусть parse_file
возвращает кортеж и сохраняет кортеж в
self.stats
.
Затем, например, вы можете получить доступ к тому, что раньше называлось stat3
, с self.stats[2]
.
Ответ 4
В parse_file
возьмите аргумент self
(как и в __init__
). Если вам нужен другой контекст, просто передайте его как дополнительные аргументы, как обычно.
Ответ 5
Вы должны объявить parse_file как это; def parse_file(self)
. Параметр "self" является скрытым параметром на большинстве языков, но не в python. Вы должны добавить его в определение всех тех методов, которые принадлежат классу.
Затем вы можете вызвать функцию из любого метода внутри класса, используя self.parse_file
Ваша последняя программа будет выглядеть так:
class MyClass():
def __init__(self, filename):
self.filename = filename
self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None
self.parse_file()
def parse_file(self):
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5
Ответ 6
Я думаю, что ваша проблема связана с неправильной отступом функции init. Это должно быть как
class MyClass():
def __init__(self, filename):
pass
def parse_file():
pass