Форум сайта python.su
88
py.user.nextВ питоне это не всегда обязательно и во многих случаях достаточно предоставить необходимый интерфейс.
Надо сделать общий Critter с методом, а потом от него пронаследоваться.
iterable …and objects of any classes you define with an __iter__() or __getitem__()
The context management protocol consists of a pair of methods that need to be provided for a context manager object to define a runtime context:и т.д.
contextmanager.__enter__()
contextmanager.__exit__(exc_type, exc_val, exc_tb)
Офлайн
857
ShamanЕсли он не сделает общий Critter, ему придётся метод кормления делать в каждом животном.
То есть не “надо сделать общий Critter с методом”, а “желательно сделать общий Critter с методом”.
Офлайн
88
py.user.nextЭто всё понятно, но это уже его проблемы. По ТЗ там вообще единственный класс.
Если он не сделает общий Critter, ему придётся метод кормления делать в каждом животном.Если же он будет животных делать из Critter'а, то расширение одного животного затронет остальных.
Офлайн
857
ShamanПо ТЗ там вообще надо написать код, который потом надо переписывать, случись что. ;)
По ТЗ там вообще единственный класс.
Офлайн
0
Сам недавно выполнял это задание. Всему классу Critter добавил пустой список critter_list. А при создании экземпляра класса Critter конструктор добавляет новосозданный объект в этот список при помощи Critter.critter_list.append(self).
class Critter(object): total = 0 critter_list = [] def __init__(self, name): """Initial critter attributes. Name is defined on instantiating, hunger and boredom are randomly picked""" self.__name = name self.__hunger = random.randint(0, 20) self.__boredom = random.randint(0, 30) Critter.total += 1 Critter.critter_list.append(self) print("You have adopted a new critter!")
choice = input("Choose an option: ") if choice == "1": name = input("Name your pet: ") crit = Critter(name) elif choice == "2": food = input("How much food do you want to give?: ") for critter in Critter.critter_list: critter.feed(food) elif choice == "3": fun = input("How much time do you want to play with your pets?: ") for critter in Critter.critter_list: critter.play(fun)
Офлайн
568
Wannabee
Это весьма глупо архитектурно. Основная идея ООП - отражение на код объектов реального мира.
Логично предположить, что объект типа Тварь инкапсулирует логику работы именно с одной единицей животного мира и ничего не знает об остальном его многообразии.
class Critter(object): def __init__(self, name): pass class ZooPark(object): def __init__(self): self.critters = [] def add_criter(self, critter): self.critters.append(criter)
Отредактировано FishHook (Июнь 22, 2015 13:11:04)
Офлайн
0
Я вот так сделал:
#!/usr/bin/env python3.4 #Моя ферма import random class Critter(object): """Виртуальный питомец""" def __init__(self, name): self.name = name self.hunger = random.randrange(10) self.boredom = random.randrange(10) def __str__(self): info = self.name + ":\n" info += "Уровень голода - " + str(self.hunger) + "\n" info += "Уровень несчастности - " + str(self.boredom) +"\n" return info def __pass_time(self): self.hunger += 1 self.boredom += 1 @property def mood(self): unhappines = self.hunger + self.boredom if unhappines < 5: m = "Прекрасно" elif 5 <= unhappines <= 10: m = "Неплохо" elif 11 <= unhappines <= 15: m = "Не сказать чтобы хорошо" else: m = "Ужасно" return m def talk(self): print("Меня зовут", self.name, "и сейчас я чувствую себя", self.mood, "\n") self.__pass_time() def eat(self, food = 4): print("М-р-р-р, спасибо!") self.hunger -= food if self.hunger < 0: self.hunger = 0 self.__pass_time def play(self, fun = 4): print("Уииии!") self.boredom -= fun if self.boredom < 0: self.boredom = 0 self.__pass_time def my_ferm(): quantity = int(input("Сколько зверей на ферме вы хотите?")) ferma = [] for i in range(quantity): crit_name = input("Как вы назовете свою зверюшку?\t") ferma.append(i) ferma[i] = Critter(crit_name) return quantity, ferma def main(): quantity, ferma = my_ferm() choice = None while choice != "0": print(""" Моя зверюшка 0 - Выйти 1 - Узнать о самочувствии зверюшки 2 - Покормить зверюшку 3 - Поиграть со зверюшкой """) choice = input("Ваш выбор\t") print() #выход if choice == "0": print("До свидания") #беседа со зверюшкой elif choice == "1": for i in range(quantity): ferma[i].talk() #кормление зверюшки elif choice == "2": food = int(input("Сколько кг корма ты мне дашь?\t")) for i in range(quantity): ferma[i].eat(food) #игра со зверюшкой elif choice == "3": fun = int(input("Сколько времени ты мне уделишь?\t")) for i in range(quantity): ferma[i].play(fun) elif choice == "4": for i in range(quantity): print(ferma[i]) else: print("Извините в меню нет пункта", choice) main()
def my_ferm(): quantity = int(input("Сколько зверей на ферме вы хотите?")) ferma = [] for i in range(quantity): crit_name = input("Как вы назовете свою зверюшку?\t") ferma.append(i) ferma[i] = Critter(crit_name) return quantity, ferma
Отредактировано psyh (Июль 8, 2015 10:07:10)
Офлайн
568
И хотел уже похвалить, но вдруг откуда ни возьмись
1.
ferma.append(i) ferma[i] = Critter(crit_name)
elif choice == "2": food = int(input("Сколько кг корма ты мне дашь?\t")) for i in range(quantity): ferma[i].eat(food) #игра со зверюшкой elif choice == "3": fun = int(input("Сколько времени ты мне уделишь?\t")) for i in range(quantity): ferma[i].play(fun) И так далее!
Офлайн
0
Пересмотрел много раз код, все равно не пойму что не так.
Офлайн
-1
psyh
Да, пойдёт. Для начинающего изучать ооп, вполне прилично.
Офлайн