Я пишу код, который берет имя файла, открывает файл и анализирует некоторые данные. Я бы хотел сделать это в классе. Следующий код работает:
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__
этого класса? Или я неправильно об этом думаю?
Ответы:
Вызовите функцию таким образом:
Вам также необходимо определить функцию parse_file () следующим образом:
parse_file
Метод должен быть привязан к объекту после вызова его (потому что это не статический метод). Это делается путем вызова функции для экземпляра объекта, в вашем случае это экземплярself
.источник
Если я не ошибаюсь, обе функции являются частью вашего класса, вы должны использовать его так:
замените вашу строку:
с участием:
источник
self.parse_file()
а почему нетparse_file()
?def parse_file(self):
не должен быть вложен в__init__
функцию, чтобы у вас не было частично инициализированного объекта?Как насчет:
Кстати, если у вас есть переменные с именами
stat1
,stat2
и т.д., ситуация выпрашивая кортежа:stats = (...)
.Итак, позвольте
parse_file
вернуть кортеж и сохранить его вself.stats
.Затем, например, вы можете получить доступ к тому, что раньше вызывалось
stat3
с помощьюself.stats[2]
.источник
parse_file
функция была методомMyClass
объекта. Где былоself
бы необходимо?В
parse_file
, принятьself
аргумент (так же , как в__init__
). Если вам нужен какой-либо другой контекст, просто передайте его в качестве дополнительных аргументов, как обычно.источник
Вы должны объявить parse_file следующим образом;
def parse_file(self)
, Параметр «self» является скрытым параметром в большинстве языков, но не в python. Вы должны добавить его к определению всех методов, принадлежащих классу. Затем вы можете вызвать функцию из любого метода внутри класса, используяself.parse_file
ваша окончательная программа будет выглядеть так:
источник
Я думаю, что ваша проблема на самом деле связана с неправильным отступом функции инициализации. Это должно быть так
источник
@staticmethod
декоратор поверхparse_file
self
в свойparse_file
метод.