Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 21, 2015 10:43:35

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

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)
и т.д.
То есть не “надо сделать общий Critter с методом”, а "желательно сделать общий Critter с методом".

Офлайн

#2 Июнь 21, 2015 11:29:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

Shaman
То есть не “надо сделать общий Critter с методом”, а “желательно сделать общий Critter с методом”.
Если он не сделает общий Critter, ему придётся метод кормления делать в каждом животном.
Если же он будет животных делать из Critter'а, то расширение одного животного затронет остальных.



Офлайн

#3 Июнь 21, 2015 11:33:06

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

py.user.next
Если он не сделает общий Critter, ему придётся метод кормления делать в каждом животном.Если же он будет животных делать из Critter'а, то расширение одного животного затронет остальных.
Это всё понятно, но это уже его проблемы. По ТЗ там вообще единственный класс.

Офлайн

#4 Июнь 21, 2015 11:38:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

Shaman
По ТЗ там вообще единственный класс.
По ТЗ там вообще надо написать код, который потом надо переписывать, случись что. ;)



Офлайн

#5 Июнь 22, 2015 12:12:58

Wannabee
Зарегистрирован: 2014-06-11
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

Сам недавно выполнял это задание. Всему классу 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!")

Ну а чтобы покормить всех сразу потом производится итерация по каждому экземпляру в списке critter_list с помощью цикла for, и у каждого по очереди вызывается метод “покормить” или “поиграть”.
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)

Офлайн

#6 Июнь 22, 2015 13:10:32

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

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)

Офлайн

#7 Июль 8, 2015 10:05:41

psyh
От: Красноярск
Зарегистрирован: 2015-07-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

Я вот так сделал:

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

Офлайн

#8 Июль 8, 2015 10:32:51

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

И хотел уже похвалить, но вдруг откуда ни возьмись
1.

ferma.append(i)
ferma[i] = Critter(crit_name)
Это что за бред такой?

2.
		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)
И так далее!
Ну плохо же! Зачем копипастить один и тот же кусок кода? Зачем нужен индекс в цикле по списку?



Офлайн

#9 Июль 8, 2015 11:05:09

psyh
От: Красноярск
Зарегистрирован: 2015-07-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

Пересмотрел много раз код, все равно не пойму что не так.

Офлайн

#10 Июль 8, 2015 11:27:46

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Программные объекты. ООП.

psyh
Да, пойдёт. Для начинающего изучать ооп, вполне прилично.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version