Форум сайта python.su
0
Изучаю язык(да и в принципе программирование) по книге М.Доусона. Дошли до ООП. В частности на данный момент изучил главу о создании классов. Как обычно в конце главы задания. Вот авторский код (программа “Виртуальный питомец”):
class Critter(object): """Питомец""" def __init__(self, name, hanger = 0, boredom = 0): self.name = name self.hanger = hanger self.boredom = boredom def __pass_time(self): self.hanger += 3 self.boredom += 3 @property def mood(self): unhappiness = self.hanger + self.boredom if unhappiness < 5: m = "Зашибись" elif 5 <= unhappiness <= 10: m = "Норм" elif 11 <= unhappiness <= 15: m = "Не очень" elif 16 <= unhappiness <= 20: m = "Хреново" return m def talk(self): print("Привет, я",self.name, ",сейчас я чувствую себя ", self.mood, "\n") self.__pass_time() def eat(self, food = 4): food = acquaintance("Сколько корма вы хотите дать питомцу?") print("Мрр...Спасибо!:)") self.hanger -= food if self.hanger < 0: self.hanger = 0 self.__pass_time() def play(self, fun = 4): fun = acquaintance("Сколько времени вы потратите на игру с питомцем?") print("Wowww!!!") self.boredom -= fun if self.boredom < 0: self.boredom = 0 self.__pass_time() def main(): crit_name = input("Дайте имя вашему питомцу:") crit = Critter(crit_name) choice = None while choice != "0": print(""" Тамагочи 0 - Выйти 1 - Поговорить с питомцами 2 - Покормить питомцев 3 - Поиграть с питомцами """) choice = input("Ваш выбор:") print() if choice == "0": print("До свидания") elif choice == "1": crit.talk() elif choice == "2": crit.eat() elif choice == "3": crit.play() else: print("Такого пункта в меню нет") main() input("Push Enter for Exit")
import random class Critter(object): """Питомец""" pets = [] total = 0 pets_names = [] @staticmethod def status(): print("Всего питомцев сейчас", Critter.total) @staticmethod def all_eat(): for i in Critter.pets: i.eat() @staticmethod def all_play(): for i in Critter.pets: i.play() @staticmethod def all_talk(): for i in Critter.pets: i.talk() def __init__(self, name, hanger = random.randrange(1, 15), boredom = random.randrange(1, 15)): self.name = name self.hanger = hanger self.boredom = boredom Critter.pets.append(self) Critter.total += 1 Critter.pets_names.append(name) self.talk() def __str__(self): rep = "Объект класса Critter\n" rep += "имя:" + self.name +"\n" rep += "голод:" + str(self.hanger) +"\n" rep += "печаль:" + str(self.boredom) +"\n" return rep def sale(self): print("Ваш питомец", self.name, "продан") Critter.pets.remove(self) Critter.pets_names.remove(self.name) Critter.total -= 1 def __pass_time(self): self.hanger += 3 self.boredom += 3 @property def mood(self): unhappiness = self.hanger + self.boredom if unhappiness < 5: m = "Зашибись" elif 5 <= unhappiness <= 10: m = "Норм" elif 11 <= unhappiness <= 15: m = "Не очень" elif 16 <= unhappiness <= 20: m = "Хреново" return m def talk(self): print("Привет, я",self.name, ",сейчас я чувствую себя ", self.mood, "\n") self.__pass_time() def eat(self, food = 4): food = acquaintance("Сколько корма вы хотите дать питомцу?") print("Мрр...Спасибо!:)") self.hanger -= food if self.hanger < 0: self.hanger = 0 self.__pass_time() def play(self, fun = 4): fun = acquaintance("Сколько времени вы потратите на игру с питомцем?") print("Wowww!!!") self.boredom -= fun if self.boredom < 0: self.boredom = 0 self.__pass_time() def pet_instanse(): crit_name = None while not crit_name: crit_name = input("Дайте имя вашему питомцу"). title(). strip() crit = Critter(crit_name) return crit def acquaintance(question): response = None while response not in range(10): print("Введите значение от 0 до 9") try: response = int(input(question)) except (TypeError, ValueError): print("Недопустимый ввод") return response def main(): choice = None while choice != "0": print(""" Тамагочи 999 - Завести питомца 0 - Выйти 000 - Количество питомцев 111 - Поговорить с питомцами 222 - Покормить питомцев 333 - Поиграть с питомцами 555 - Выбрать питомца """) choice = input("Ваш выбор:") print() if choice == "0": print("До свидания") elif choice == "999": new_pets = pet_instanse() elif choice == "123": for i in Critter.pets: print(i) elif choice == "000": Critter.status() elif choice == "111": Critter.all_talk() elif choice == "222": Critter.all_eat() elif choice == "333": Critter.all_play() elif choice == "555": new_pets = input("Введите имя питомца").title() .strip() if new_pets not in Critter.pets_names: print("Такого питомца у вас нет!") else: for i in Critter.pets: if new_pets == i.name: print(""" 1 - Узнать самочувствие 2 - Покормить питомца 3 - Поиграть с питомцем 4 - Продать питомца """) choice = input("Ваш выбор:") if choice == "1": i.talk() elif choice == "2": i.eat() elif choice == "3": i.play() elif choice == "4": i.sale() Critter.status() else: print("Такого пункта в меню нет") else: print("Такого пункта в меню нет") main() input("Push Enter for Exit")
Офлайн
Babay82Как я понимаю, при обработке def __init__ сразу подставляются конкретные результаты вызова указанных функций и помещаются в поле __defaults__ соответствующего объекта (ссылающегося на метод). Набросал для проверки такой код:
И сразу вопрос, почему в конструкторе, при инстанцировании каждого питомца уровни голода и уныния выбираютя случайно, но у всех одинаковые. т.е. при каждом запуски программы они разные, но одинаковые при создании у всех питомцев, пробовал и randint и randrange , результат тот-же, так и не понял в чем причина?
s = "abc" def get_str(): return s def change_str(new_s=get_str()): global s print("new_s =", new_s) s = "123" if __name__ == "__main__": change_str() print("s =", get_str()) change_str() print("s =", get_str()) print(change_str.__defaults__)
Прикреплённый файлы:
pycharm64_2019-04-29_16-59-44.jpg (176,3 KБ)
Офлайн
857
Babay82Это не ООП.
Изучаю язык(да и в принципе программирование) по книге М.Доусона. Дошли до ООП.
Babay82Детский лепет. (Простые функции неправильно пишешь.)
Требуется оценка.
Отредактировано py.user.next (Апрель 30, 2019 02:32:23)
Офлайн
186
py.user.next Не пугай ребёнка!
Офлайн
0
py.user.nextЕстественно! К самому ООП ещё и не приступали. Прошёл только главу которая была посвящена созданию классов. После неё задание. По нему собственно и был вопрос.
Это не ООП.
py.user.nextАхрененный ответ. Спасибо, я сразу многое понял. Вы так подробно всё обьяснили!!!
Детский лепет. (Простые функции неправильно пишешь.)
Офлайн
857
Babay82Ты ничего не понял. Хочешь подробностей - ну ладно. Твой код не то что в ООП плох, он даже в простейших вещах плох. Почему он плох в простейших вещах - потому что ты не знаешь азов программирования.
я сразу многое понял
food = acquaintance("Сколько корма вы хотите дать питомцу?", 0, 20)
fun = acquaintance("Сколько времени вы потратите на игру с питомцем?", 0, 10)
Отредактировано py.user.next (Май 1, 2019 06:24:05)
Офлайн
0
py.user.nextДа потому что они изначально связаны связаны параметром unhappynes и методом __pass_time(self), это изначальная задумка игры, есть разброс 9 ед, хочешь 1 дай хочешь 9. Таковы правила.
Вот с чего вдруг у тебя play() и eat() связаны максимальным количеством единиц?
py.user.nextФункция написанная мной здесь всего одна, и да, с названием я тут действительно прое…ся, т.к. эта функция взята из другого кода, и исправлена для этого.
Функции не чистые, с побочными эффектами.
Функции не общего вида, а привязанные к фиксированным значениям.
Магические числа, разбросанные внутри функций.
Функции называются не императивно.
Офлайн
568
Babay82Babay82, вы так далеко то не уедете. Вам дали подсказки - вперед гуглить, вы не в школе, “учить” вас никто не будет.
Так что в ней не так, какой побочный эффект, какие магические числа?
Офлайн
0
FishHook
Спасибо.
Так в том то и дело, чисел в ней никаких нет вообще, и функция служит для того , что бы обработать правильность ввода пользователя, чем она не чистая? Она не вносит каких либо изменений в программу, принимая значение одно и то же значение от пользователя она всегда возвратит один и тот же результат, она не зависит ни от каких внешних данных. Побочный эффект? То что она взаимодействует с консолью? Так она для этого и предназначена. Вроде в Python(да и не только) не всегда есть возможность писать только чистые функции? Так что с ней конкретно так ужасно, кроме названия(которое как я уже объяснял осталось от прежней программы, да тут затупил, просмотрел)?
Офлайн
568
Babay82
Babay82Ну во-первых, вы видимо как-то не очень внимательно прочитали данные вам ссылки, иначе вы бы понимали, что “числа” в данном случае понятие условное, так же как “звездное небо” не состоит исключительно из звезд в астрономическом понимании. Во-вторых, именно магические числа у вас таки есть.
Так в том то и дело, чисел в ней никаких нет вообще
def __pass_time(self): self.hanger += 3 self.boredom += 3
Офлайн