Найти - Пользователи
Полная версия: Программные объекты. ООП.
Начало » Python для новичков » Программные объекты. ООП.
1 2 3
Shaman
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 с методом".
py.user.next
Shaman
То есть не “надо сделать общий Critter с методом”, а “желательно сделать общий Critter с методом”.
Если он не сделает общий Critter, ему придётся метод кормления делать в каждом животном.
Если же он будет животных делать из Critter'а, то расширение одного животного затронет остальных.
Shaman
py.user.next
Если он не сделает общий Critter, ему придётся метод кормления делать в каждом животном.Если же он будет животных делать из Critter'а, то расширение одного животного затронет остальных.
Это всё понятно, но это уже его проблемы. По ТЗ там вообще единственный класс.
py.user.next
Shaman
По ТЗ там вообще единственный класс.
По ТЗ там вообще надо написать код, который потом надо переписывать, случись что. ;)
Wannabee
Сам недавно выполнял это задание. Всему классу 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)
FishHook
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)

как то так
psyh
Я вот так сделал:
#!/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
FishHook
И хотел уже похвалить, но вдруг откуда ни возьмись
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)
И так далее!
Ну плохо же! Зачем копипастить один и тот же кусок кода? Зачем нужен индекс в цикле по списку?

psyh
Пересмотрел много раз код, все равно не пойму что не так.
MiK
psyh
Да, пойдёт. Для начинающего изучать ооп, вполне прилично.
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