Comme vous pouvez le voir, j'ai une super classe bar_for_foo_mixin() et j'ai une sous-classe myfoo(bar_for_foo_mixin): Je calcule une opération self.Z = X+Y dans la méthode bar() de superclasse.

Maintenant, je veux que self.z = 0 soit mis à jour pour le calcul effectué dans la méthode bar () et que cette valeur soit incluse dans la sous-classe myfoo(bar_for_foo_mixin): et l'utiliser dans la sous-classe.

class bar_for_foo_mixin():
    def __init__(self):
        self.z = 0

    def bar(self, q):
        x = 2
        y = 8
        self.z = x + y + q


class oldfoo():
    def __init__(self):
        pass

    var = bar_for_foo_mixin()
    var.bar(10)


class myfoo(bar_for_foo_mixin):
    def __init__(self):
        super(myfoo, self).__init__()

    def hello(self):
        print("hello", self.z)


final = myfoo()
final.hello()

Résultat du code:

hello 0

Résultat attendu:

hello 20
1
Vamsi Nimmala 15 mars 2019 à 02:41

2 réponses

Meilleure réponse

L'instance bar_for_foo_mixin stockée dans votre variable de classe oldfoo.var est une instance complètement distincte de l'objet myfoo que vous avez instancié dans le programme principal, de sorte que leur variable d'instance z ne serait pas partagée .

Si vous souhaitez qu'une variable soit partagée entre toutes les instances d'une classe, vous devez plutôt en faire une variable de classe et créer des méthodes dédiées à la mise à jour des variables de classe, telles que bar_for_foo_mixin.bar, une méthode de classe à la place:

class bar_for_foo_mixin():
    z = 0

    @classmethod
    def bar(cls, q):
        x = 2
        y = 8
        cls.z = x + y + q


class oldfoo():
    def __init__(self):
        pass

    var = bar_for_foo_mixin()
    var.bar(10)


class myfoo(bar_for_foo_mixin):
    def __init__(self):
        super(myfoo, self).__init__()

    def hello(self):
        print("hello", self.z)

final = myfoo()
final.hello()

Cela produit:

hello 20
1
blhsing 15 mars 2019 à 00:02

Vous n'appelez même pas la méthode bar par la nouvelle variable final:

class bar_for_foo_mixin():
    def __init__(self):
        self.z = 0

    def bar(self, q):
        x = 2
        y = 8
        self.z = x + y + q

class myfoo(bar_for_foo_mixin):
    def __init__(self):
        super(myfoo, self).__init__()

    def hello(self):
        print("hello", self.z)

final = myfoo()
final.bar(10) # <== call it to take effect
final.hello() # ==> hello 20
1
MrGeek 14 mars 2019 à 23:46