Найти - Пользователи
Полная версия: Решение задачи композиционным подходом или выбрать другой способ?
Начало » Python для новичков » Решение задачи композиционным подходом или выбрать другой способ?
1
G-Bond
Всем привет.

Столкнулся с проблемой, попробую описать на примере:
1. Нужно создать программу, которая по входным условиям будет создавать модель комнаты с определенными параметрами.
Тут все ясно, получается что-то типа такого:

class Room(object):
	def __init__(self, param):
		self.param = param
	def some_func(self):
		#todo
		pass

Класс, который представляет собой базовую комнату. При создании можем дать разные параметры, добавить различные методы и т.д.

2. Дальше, в комнату нужно поместить случайное количество других определенных объектов (например, “двери”), которые так же могут принимать разные параметры и методы, к которым можно обращаться.
Например, создаю базовый класс двери:

class Door(object):
	def __init__(self, opened = False, param):
		self.param = param
	def some_func():
		#todo
		pass

А вот как поместить случайное кол-во этих “дверей” в “комнату”, что бы к конкретной двери можно было обратиться - ума не приложу. Почитал о композиционном подходе: тут понятно, если создавать конкретное кол-во дверей с конкретными параметрами. Как с случайным кол-вом - не пойму.
Или выбрать другой подход? Подскажите, пожалуйста.

В идеале, программка должна выглядеть так:
Система создает комнату с случайным количеством дверей с параметром “открыта” = Да/Нет (будет определятся, например, так же случайно). Допустим получилось три двери (две закрытых, одна открыта).
Выводится список дверей в комнате и предлагает выбрать дверь. Если юзер выбирает закрытую - сообщение, что закрыто; если открытую - что открыто

Думал реализовать как-нибудь через словари, но на сколько это верный подход, особенно, если придется по разному расширяться.

Я только начал учить Python и ООП, потому вопрос может звучать глупо
Заранее извините и спасибо
Firik
Ну а в чем проблема? Понасоздавать экземпляров класса Door и ими уже оперировать. Создавать например при помощи range()
G-Bond
Я так понимаю, создать что-то типа:

list = []
for i in range(random_num):
    list.append(Room(params))

Попробую. Спасибо
ayb
Как-то так, хотя возможно я не совсем понял что Вы хотите :

class Door(object):
    def __init__(self, param, opened=False):
        self.param = param
        self.opened = opened
    @property
    def is_opened(self):
        if self.opened:
            return "Opened"
        return "Closed"
class Room(object):
    def __init__(self, param):
        self.param = param
        self.doors = None
    def add_doors(self, doors_num):
        self.doors = {"door_{}".format(x): Door("param")
                      for x in range(doors_num)}
    def __getattribute__(self, item):
        if item.startswith("door_"):
            attr = self.doors.get(item)
            if not attr:
                raise AttributeError("No such door")
            return attr
        return super().__getattribute__(item)
r = Room('1')
r.add_doors(5)
print(r.door_1.is_opened)
r.door_1.opened = True
print(r.door_1.is_opened)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB