Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 21, 2015 22:14:28

G-Bond
Зарегистрирован: 2015-12-21
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Решение задачи композиционным подходом или выбрать другой способ?

Всем привет.

Столкнулся с проблемой, попробую описать на примере:
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 и ООП, потому вопрос может звучать глупо
Заранее извините и спасибо

Отредактировано G-Bond (Дек. 21, 2015 22:17:33)

Офлайн

#2 Дек. 21, 2015 22:33:44

Firik
Зарегистрирован: 2015-12-02
Сообщения: 151
Репутация: +  6  -
Профиль   Отправить e-mail  

Решение задачи композиционным подходом или выбрать другой способ?

Ну а в чем проблема? Понасоздавать экземпляров класса Door и ими уже оперировать. Создавать например при помощи range()

Офлайн

#3 Дек. 21, 2015 22:42:02

G-Bond
Зарегистрирован: 2015-12-21
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Решение задачи композиционным подходом или выбрать другой способ?

Я так понимаю, создать что-то типа:

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

Попробую. Спасибо

Офлайн

#4 Дек. 22, 2015 08:46:23

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Решение задачи композиционным подходом или выбрать другой способ?

Как-то так, хотя возможно я не совсем понял что Вы хотите :

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version