J'écris du code qui prend un nom de fichier, ouvre le fichier et analyse certaines données. J'aimerais faire ça 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 m'implique de mettre toutes les machines d'analyse dans le cadre de la __init__
fonction de ma classe. Cela semble bien maintenant pour ce code simplifié, mais la fonction parse_file
a également plusieurs niveaux d'indention. Je préfère 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()
n'est pas dans le cadre de la __init__
fonction. Existe-t-il un moyen d'appeler une fonction de classe à partir __init__
de cette classe? Ou est-ce que je pense à cela de la mauvaise façon?
Réponses:
Appelez la fonction de cette manière:
Vous devez également définir votre fonction parse_file () comme ceci:
La
parse_file
méthode doit être liée à un objet lors de son appel (car ce n'est pas une méthode statique). Cela se fait en appelant la fonction sur une instance de l'objet, dans votre cas l'instance estself
.la source
Si je ne me trompe pas, les deux fonctions font partie de votre classe, vous devriez l'utiliser comme ceci:
remplacez votre ligne:
avec:
la source
self.parse_file()
et nonparse_file()
?def parse_file(self):
ne doit pas être imbriqué sous la__init__
fonction pour ne pas avoir d'objet partiellement initialisé?Que diriez-vous:
Soit dit en passant, si vous avez des variables nommées
stat1
,stat2
etc., la situation est la mendicité pour un tuple:stats = (...)
.Alors,
parse_file
retournons un tuple et stockons le tuple dansself.stats
.Ensuite, par exemple, vous pouvez accéder à ce qui était appelé
stat3
avecself.stats[2]
.la source
parse_file
fonction soit une méthode de l'MyClass
objet. Où serait-self
il nécessaire?Dans
parse_file
, prenez l'self
argument (comme dans__init__
). S'il y a un autre contexte dont vous avez besoin, transmettez-le simplement comme arguments supplémentaires, comme d'habitude.la source
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 qui appartiennent à une classe. Ensuite, vous pouvez appeler la fonction à partir de n'importe quelle méthode à l'intérieur de la classe en utilisantself.parse_file
votre programme final ressemblera à ceci:
la source
Je pense que votre problème est en fait de ne pas indenter correctement la fonction init . Cela devrait être comme ça
la source
@staticmethod
décorateur au-dessus deparse_file
self
dans votreparse_file
méthode.