Salut à tous
J'ai une classe dont je veux qu'une méthode soit un input provenant de l'utilisateur. Cette méthode ayant peut être éventuellement besoin de définir des éléments garder en mémoire d'un appel sur l'autre, il me parait donc aussi nécessaire d'offrir à l'utilisateur un moyen de spécifier ces éléments.
Voici un exemple avec la classe UneClasse, je vous ai mis un commentaire au bout des lignes pour lesquelles je souhaite laisser l'utilisateur libre de les définir.
La classe Pop, ne sert que de support pour l'exemple.
De là, je voudrais maintenant pouvoir definir ma classe à partir de cet input utilisateur :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 class Pop(): def __init__(self, a): self.a=a pop = Pop(10000) class RecruiterBase(): def __init__(self, params=None): self.params = params self.r = random.Random(0) #### Want to be user input self.historic = [] #### Want to be user input def GetNumberOfRecruitment(self, pop): res = pop.a + self.params['range']*self.r.random() #### Want to be user input self.historic.append(res) #### Want to be user input return res r_base = RecruiterBase({'range':10}) print( "Reference:", r_base.GetNumberOfRecruitment(pop) )
J'ai essayé 2 trucs, qui fonctionnent :Code:
1
2
3
4
5
6
7
8 def f(uneclasse, pop): res = pop.a + uneclasse.params['range']*uneclasse.r.random() uneclasse.historic.append(res) return res def f_init(uneclasse): uneclasse.r = random.Random(0) uneclasse.historic = []
1) Une classe qui définit sa méthode Foo dynamiquement :
2)Une factory :Code:
1
2
3
4
5
6
7
8
9 class UneClasse(): def __init__(self, foo_fct=None, params=None, f_init=None): self.params = params self.Foo = partial( foo_fct, self ) if foo_fct is None : self.Foo = lambda pop : 0 if f_init : f_init(self) r1 = UneClasse(f, {'range':10}, f_init ) print( "Option1 :", r1.Foo(pop) )
Et là j'aurais besoin de vos commentaires/avis. Car je n'arrive pas à me décider entre ces 2 options (il y en a d'autres encore ceci dit). J'ai l'impression que la 1ere est beaucoup moins propre, bien que plus simple à utiliser et ayant un code plus concis.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 def UneClasseFactory(foo_fct=None, f_init=None): class UneClasse(): def __init__(self, params=None): self.params = params if f_init : f_init(self) if foo_fct : def Foo(self, pop): return foo_fct( self, pop) else : def Foo(self, pop): return 0 return UneClasse r2 = UneClasseFactory(f, f_init )({'range':10}) print("Option2 :", r2.Foo(pop) )
Merci pour vos retours