J'ai une classe Foo qui est instanciée un nombre indéfini de fois pendant ma séquence de programme. Ainsi:

def main():
    f = Foo()
    while f.run():
        del f
        f = Foo()

run() étant une méthode qui exécute une condition décisive pour maintenir le programme en vie.

Maintenant, ma classe Foo crée sur sa méthode __init__ deux objets a et b:

Classe Foo

class Foo:
    def __init__(self):
        a = A()
        b = B(a.var)

Je recherche un moyen de a être déclaré uniquement à la première Foo instanciation et d'utiliser la même a première instanciée à l'autre {{X3 }} instanciations.

Le problème survient car b dépend de a. J'ai pensé à quelques solutions - de jouer avec __new__ et __init__ pour remplacer __del__ et la variable globale comme cache - mais aucune n'a fonctionné.

note : A doit être sur le même module que Foo

0
tmvaz 17 avril 2018 à 01:57

3 réponses

Meilleure réponse

Peut-être en utilisant une variable de classe?

class Foo:
    a = None
    def __init__(self):
        if not Foo.a:
            Foo.a = A()
        b = B(Foo.a.var)

Et la fonction B doit vérifier si a est None.

2
Eddy Pronk 17 avril 2018 à 22:24

Je crains que certaines de vos exigences rendent Foo extrêmement difficile à tester. Au lieu de cela, je vous suggère de déplacer certaines des dépendances de votre constructeur vers une méthode de classe start qui serait responsable de la création de l'instance A initiale (dans le même module que Foo) puis en réutilisant cette instance dans une méthode refresh.

class Foo:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @classmethod
    def start(cls):
        a = A()
        b = B(a.var)
        return cls(a, b)

    def refresh(self):
        b = B(self.a.var)
        return self.__class__(self.a, b)

Ensuite, votre fonction main ressemblerait à quelque chose comme:

def main():
    f = Foo.start()
    while f.run():
        f = f.refresh()

En écrasant la variable f, vous supprimez effectivement la référence à l'ancienne instance qui sera éventuellement récupérée.

1
cr3 16 avril 2018 à 23:18

Si je vous comprends bien, vous devriez pouvoir faire de a une variable de classe.

class Foo:
    a = A()

    def __init__(self):    
        b = B(Foo.a.var)
1
bphi 16 avril 2018 à 23:01