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?
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
.
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()
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]
.
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.
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