2016-10-08 1 views
0

alors je me suis un peu passé à travers quelques livres de modèles de conception et j'ai décidé de faire mon propre en python (le livre est pour Java), et je suis tombé sur cette question ne peut pas résoudre, qu'est-ce que je manque ici?Python Composite Desing Pattern - RecursionError: la profondeur de récursivité maximale a dépassé

Alors pourquoi est-ce que je reçois ici une erreur de récursivité?

class Component: 

    _components = [] 

    def __init__(self, value): 
     self.value = value 

    def add(self, *components): 
     self._components.extend(components) 

    def remove(self, *components): 
     self._components = list(set(self._components).difference(set(components))) 

    def get_components(self): 
     return self._components 

    def __repr__(self): 
     return "Component value: {}".format(self.value) 


class ComputerComponent(Component): 

    def turn_on(self): 
     self.on = True 
     for component in self.get_components(): 
      component.turn_on() 
     print("{} turned on".format(self.value)) 



class Computer(ComputerComponent): 
    pass 

class LCDScreen(ComputerComponent): 
    pass 

class Mouse(ComputerComponent): 
    pass 

class Keyboard(ComputerComponent): 
    pass 

computer = Computer("computer") 
lcd_screen = LCDScreen("lcd_screen") 
mouse = Mouse("mouse") 
keyboard = Keyboard("keyboard") 

computer.add(lcd_screen,mouse,keyboard) 

computer.turn_on() 

Répondre

1

_components doit être une variable d'instance, pas une variable de classe. Comme il est, ajouter les composants à l'ordinateur les ajoute à tous les autres composants. Autrement dit, chaque composant est un composant de chaque autre composant, ce qui entraîne une boucle infinie.

class Component: 

    def __init__(self, value): 
     self.value = value 
     self._components = [] 

    def add(self, *components): 
     self._components.extend(components) 

    def remove(self, *components): 
     self._components = list(set(self._components).difference(set(components))) 

    def get_components(self): 
     return self._components 

    def __repr__(self): 
     return "Component value: {}".format(self.value)