#python #recursion #composite
#python #рекурсия #композитный
Вопрос:
итак, я немного изучал некоторые книги по шаблонам проектирования, и я решил создать свой собственный на python (книга для Java), и я наткнулся на эту проблему, которую я не могу решить, чего мне здесь не хватает?
Итак, почему я получаю здесь ошибку рекурсии?
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)