Bonjour,
J'ai la classe suivante (ce que font les méthodes n'est pas important) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | """Contain the class for smoothing data.""" from mpf import processors as proc from mpf import settings as stg __all__ = ('MovingAveraging') class MovingAveraging: """Apply a moving average on data.""" def __init__(self, step): self.step = step def save(self, cow, dates, prods): """Save the result of the analysis of ``cow``.""" params = [] for i in range(len(dates)): date = dates[i] prod = prods[i] q_select = 'SELECT id FROM CrudeData WHERE cow = ? AND date = ?' fid = stg.model.query(q_select, (cow, date))[0][0] params.append((fid, prod, self.step)) q_insert = 'INSERT INTO SmoothedData VALUES (?, ?, ?)' stg.model.querymany(q_insert, params) def work(self, cow): """Run the analysis of ``cow``.""" dates = stg.model.dates(cow) dates = proc.ma.truncate(dates, self.step) prods = stg.model.prods(cow) prods = proc.ma.smooth(prods, self.step) self.save(cow, dates, prods) |
Et je l'instancie ici :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | """The entry point of the code. Run it to make the analysis work.""" from mpf import analysis from mpf import views from mpf import settings as stg def main(): """Launch the analysis.""" for cow in stg.model.cows(): try: views.Crude().render(cow) analysis.MovingAveraging(step=2).work(cow) analysis.MovingAveraging(step=4).work(cow) views.MovingAveraging().render(cow, [2, 4]) except sqlite3.IntegrityError: pass # TODO: cache if __name__ == '__main__': main() |
Je me pose alors plusieurs questions sur le fait d'utiliser des attributs de classe ou des paramètres pour les méthodes.
Tout d'abord, une des manières suivantes d'instancier mon objet, équivalentes au niveau du résultat, est-elle préférable ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # Les paramètres sont passés en argument à la méthode analysis.MovingAveraging().work(cow, step=2) analysis.MovingAveraging().work(cow, step=4) # Les paramètres sont passés à l'instanciation, puis ajoutés comme attributs de classe analysis.MovingAveraging(cow, step=2).work() analysis.MovingAveraging(cow, step=4).work() # La méthode 'work' est appelée à l'instanciation analysis.MovingAveraging(cow, step=2) analysis.MovingAveraging(cow, step=4) # Un tableau de pas est passé à l'instanciation analysis.MovingAveraging(cow, steps=[2, 4]) # Un tableau de pas est passé en paramètres analysis.MovingAveraging().work(cow, steps=[2, 4]) # Autres combinaisons... |
La deuxième question porte sur le passage de valeurs entre les méthodes. Actuellement, je fais :
1 2 3 4 5 6 7 8 9 10 | def work(self, cow): """Run the analysis of ``cow``.""" dates = stg.model.dates(cow) dates = proc.ma.truncate(dates, self.step) prods = stg.model.prods(cow) prods = proc.ma.smooth(prods, self.step) self.save(cow, dates, prods) |
Mais je pourrais aussi faire :
1 2 3 4 5 6 7 8 9 10 | def work(self): """Run the analysis.""" self.dates = stg.model.dates(self.cow) self.dates = proc.ma.truncate(dates, self.step) self.prods = stg.model.prods(self.cow) self.prods = proc.ma.smooth(prods, self.step) self.save() |
Existe-t-il, de manière générale, une règle pour répondre à ces questions ?
Merci.
+0
-0