Задать вопрос
@nishe

Как называется реализованный мною прием в классе Scene?

Я создал класс Scene, который инициализирует свои атрибуты как объекты трех классов: Pirat, Carrot, Customer. Затем я создал функцию the_play (что-то на подобии начала пьесы), которая вызывает методы для ранее проинициализированных атрибутов (являющимися объектами других классов)
Как называется этот прием: делегирование или композиция? Или же это что-то иное?
class Actor:
    def line(self):
        print('Not Implemented')


class Pirat(Actor):
    @staticmethod
    def line():
        print('I\'m Pirat')


class Carrot(Actor):
    @staticmethod
    def line():
        print('I\'m Carrot')


class Customer:
    @staticmethod
    def status():
        print('I\'m customer')


class Scene:
    def __init__(self):
        self.pirat = Pirat()
        self.carrot = Carrot()
        self.customer = Customer()

    def the_play(self):
        self.pirat.line()
        self.carrot.line()
        self.customer.status()


if __name__ == '__main__':
    Scene().the_play()
  • Вопрос задан
  • 104 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
seven5674
@seven5674
Старый я уже что бы что-то в себе менять
Композиции тут, ИМХО, нет потому как нет жесткой привязки между классом Scene и Pirat/Carrot/Customer - тут скорее агрегация

Делегирование тоже под вопросом потому как само понятие предполагает возложить ответственность за что-то на кого-то. Пример
spoiler

class Actor:
    def line(self):
        print('Not Implemented')


class Pirat(Actor):
    @staticmethod
    def line():
        print('I\'m Pirat')


class Carrot(Actor):
    @staticmethod
    def line():
        print('I\'m Carrot')


class Customer:
    @staticmethod
    def line():
        print('I\'m customer')
        
class Starter:
    def play(self, who):
        return who.line()
    
class Scene:
    def __init__(self):
        self.starter = Starter()

    def the_play(self, who):
        self.starter.play(who)
            
if __name__ == '__main__':
    Scene().the_play(Carrot())
    Scene().the_play(Customer())

Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
Здесь есть агрегирование (которое раньше называлось делегированием) в форме композиции, потому что в конструкторе Scene явно создаются экземпляры. Если бы они передавались в конструктор Scene, то вместо композиции была бы агрегация.

ссылка

есть мнение, что композицией увлекаться не стоит: iodzeranov.ru/control_freak
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы