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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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) )
De là, je voudrais maintenant pouvoir definir ma classe à partir de cet input utilisateur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 = []
J'ai essayé 2 trucs, qui fonctionnent :
1) Une classe qui définit sa méthode Foo dynamiquement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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) )
2)Une factory :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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) )
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.

Merci pour vos retours