2017-10-10 4 views
0

J'ai de la difficulté à comprendre la logique des variables d'instance en héritage. Ceci est mon (simplifié) code avec des commentaires expliquant comment je comprends son comportement:Accès à l'attribut d'instance de classe de base modifié dans la classe dérivée

class Main(object): 

    def __init__(self): 
     self.p = Parent() # self.parameter = [] 
     self.c = Child() # self.parameter = [] 

    def run(self): 
     self.p.setting() # assigning value to self.parameter 
     self.c.getting() 


class Parent(object): 

    def __init__(self): 
     self.parameter = [] 

    def setting(self): 
     self.parameter = [1, 2, 3] 


class Child(Parent): 
    # not redefining __init__, so Parent __init__ is called 

    def getting(self): 
     # value was assigned to self.parameter in setting method, 
     # called before getting 
     print self.parameter 


Main().run() 

getting impressions [], au lieu de [1, 2, 3] que je m'y attendais. Pourquoi est-ce vrai? Depuis Child part __init__ avec Parent, au début self.parameter = [] pour les deux mais pourquoi est-il encore [] quand il a été attribué une valeur longtemps après Child().__init__ a été appelé? Que dois-je faire pour obtenir la valeur self.parameter modifiée dans getting?

+0

Python est pas Java; tout ne doit pas être une classe. Débarrassez-vous de 'Main'. – chepner

Répondre

1

Passons à l'exécution de votre code. Instance est créée avec Main().

En ce moment nous avons main.p = [] et main.s = [], tel que défini dans Main.__init__

  1. main.run() est appelé, et il appelle main.p.setting() et main.c.getting()

Alors maintenant , main.p.setting() change la valeur parameter de main.p à [1,2,3], et main.c.setting() imprime juste sa propre valeur parameter e, qui est toujours [], car il n'a jamais été modifié.

Si vous souhaitez modifier main.c.parameter valeur, il suffit d'appeler main.c.setting()

main = Main() 
main.c.setting() 
main.run() 
0

Vous n'héritez de rien ici Main, vous ajoutez des variables membres. Vous exprimez une relation "a", pas un "est un".

Pour hériter, définir Main en tant que tel:

class Main(Child): 

    def run(self): 
     self.setting() 
     self.getting() 

Avec votre code actuel, vous pouvez inspecter main_instance.p.parameter après avoir appelé main_instance.run() et voir que [1, 2, 3] est retourné.