Подтвердить что ты не робот

Вызов функции класса внутри __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__ этого класса? Или я думаю об этом неправильно?

4b9b3361

Ответ 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