2016-10-08 7 views
0

を超えてしまったので、私はいくつかのデザインパターンの本を読んでいましたが、私はPythonで自分自身を作ることにしました(この本はJava用です)。解決できない、何が私はここで行方不明ですか?Python Composing Desing Pattern - RecursionError:最大再帰深度が

ここで私はここで再帰エラーを取得しますか?

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() 

答えて

1

_componentsは、クラス変数ではなく、インスタンス変数である必要があります。そのままコンピュータに追加すると、すべて他のコンポーネントに追加されます。つまり、すべてのコンポーネントは他のすべてのコンポーネントのコンポーネントであり、結果として無限ループになります。

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) 
関連する問題