Составной шаблон разработки Python — ошибка рекурсии: превышена максимальная глубина рекурсии

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