2016-10-08 2 views
0

을 초과했습니다. 그래서 일부 디자인 패턴 책에 약간의 여유가 있었고 Python으로이 책을 작성하기로 결정했습니다.이 책은 제가이 문제를 발견했습니다. 해결할 수 없네, 내가 뭘 놓치고 있니?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)