web-dev-qa-db-fra.com

Appel d'une fonction de classe à l'intérieur de __init__

J'écris du code qui prend un nom de fichier, l'ouvre et analyse des données. J'aimerais faire cela en classe. Le code suivant fonctionne:

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()

Mais cela implique que je mette tous les mécanismes d'analyse syntaxique dans la portée de la fonction __init__ Pour ma classe. Cela semble aller maintenant pour ce code simplifié, mais la fonction parse_file Comporte également quelques niveaux d’indention. Je préférerais définir la fonction parse_file() comme une fonction de classe comme ci-dessous:

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

Bien sûr, ce code ne fonctionne pas car la fonction parse_file() ne fait pas partie de la portée de la fonction __init__. Est-il possible d'appeler une fonction de classe à partir de __init__ De cette classe? Ou est-ce que je pense à cela de la mauvaise façon?

102
PythonJin

Appelez la fonction de cette façon:

self.parse_file()

Vous devez également définir votre fonction parse_file () comme ceci:

def parse_file(self):

Le parse_file la méthode doit être liée à un objet lors de son appel (car ce n'est pas une méthode statique). Ceci est fait en appelant la fonction sur une instance de l'objet, dans votre cas l'instance est self.

148
Lewis Diamond

Si je ne me trompe pas, les deux fonctions font partie de votre classe, vous devriez l'utiliser comme ceci:

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

remplacez votre ligne:

parse_file() 

avec:

self.parse_file()
29
Paritosh Singh

Que diriez-vous:

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

À propos, si vous avez des variables nommées stat1, stat2, Etc., la situation demande un Tuple: stats = (...).

Alors, laissez parse_file Renvoyer un tuple et stockez-le dans self.stats.

Ensuite, par exemple, vous pouvez accéder à ce qui s'appelait auparavant stat3 Avec self.stats[2].

11
unutbu

Dans parse_file, prenez l'argument self (comme dans __init__). Si vous avez besoin d'un autre contexte, transmettez-le comme des arguments supplémentaires, comme d'habitude.

0

Vous devez déclarer parse_file comme ceci; def parse_file(self). Le paramètre "self" est un paramètre caché dans la plupart des langages, mais pas en python. Vous devez l'ajouter à la définition de toutes les méthodes appartenant à une classe. Ensuite, vous pouvez appeler la fonction depuis n’importe quelle méthode de la classe en utilisant self.parse_file

votre programme final va ressembler à ceci:

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
0
Ionut Hulub