Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
1 / 1 / 0
Регистрация: 30.03.2020
Сообщений: 42

Классы и экземпляры

02.10.2020, 11:26. Показов 5915. Ответов 22

Студворк — интернет-сервис помощи студентам
Есть класс человека, кота и дома. Создаем каждого по одному экземпляру.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Cat:
    def __init__(self, name):
        self.name = name
        self.cat_fullness = 50
        self.house = None
 
 
class Man:
 
    def __init__(self, name):
        self.name = name
        self.fullness = 50
        self.house = None
 
#Человек заезжает в дом так
    def go_to_the_house(self, house):
        self.house = house
        self.fullness -= 10
        cprint(f'{self.name} въехал в дом', color='cyan')
 
class House:
 
    def __init__(self, number):
        self.number = number
        self.food = 10
        self.money = 0
        self.cat_food = 0
        self.mud = 0
 
 
citizen = Man(name='Петя')
cat = Cat(name="Пушок")
citizen.go_to_the_house(house=my_home)
Т.к. Кот сам не может заехать в дом, Человек должен это сделать.
Нужно создать метод у Человека, который присвоит один единственный экземпляр Дома одному Коту. Как такое сделать?
На всякий случай прикрепил весь код проекта, но в нем кот сам заехал в дом.
Вложения
Тип файла: zip 03_man_ans_cat.zip (2.0 Кб, 6 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.10.2020, 11:26
Ответы с готовыми решениями:

классы, экземпляры, протоколы, и.т.п
Здравствуйте, хочу поподробней почитать про классы, экземпляры, протоколы, и.т.п , где есть доступная информация на понятном языке ? ...

Как создавать классы, структуры и их экземпляры?
Объясните вкратце пожалуйста, как создавать классы и самое важное их объекты. Читаю msdn уже 5-ый раз всё никак понять не могу. Заранее...

Проверить код, правильно ли определены классы, экземпляры, методы, возвращены данные?
Проверьте код.Правильно ли я сделал?Просто изучаю Java,застрял на ООП.Правильно ли я определил классы,экземпляры,методы,вовзратил...

22
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
02.10.2020, 12:00
Cделайте у кота метод take_to_the_house. + у кота должен быть хозяин, не так ли?
0
1 / 1 / 0
Регистрация: 30.03.2020
Сообщений: 42
02.10.2020, 12:05  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Cделайте у кота метод take_to_the_house
В задании указано # Доработать класс человека, добавив метод "подобрать кота - у кота появляется дом."
Нужно именно чтобы это сделал экземпляр Человека. Или вы имеете ввиду, создать метод у Кота, а вызвать метод Человеком?
Цитата Сообщение от dondublon Посмотреть сообщение
+ у кота должен быть хозяин, не так ли?
Про это в задании ничего не указано, но можно доработать
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
02.10.2020, 12:15
Цитата Сообщение от VetalM Посмотреть сообщение
Или вы имеете ввиду, создать метод у Кота, а вызвать метод Человеком?
Именно. Как-то же надо присвоить дом коту на непосредственном уровне.

Цитата Сообщение от VetalM Посмотреть сообщение
Про это в задании ничего не указано, но можно доработать
А кто ему присвоит дом, если не хозяин? Какой-то левый человек?

Добавлено через 5 минут
Насчёт хозяина, кстати, уже возможны варианты - как он будет переселять котов.
В общем случае, у одного человека может быть много котов. Проще будет, если человек при переселении переберёт всех своих котов и каждого затащит в новый дом. Но это не совсем феншуйно, потому что нагружает человека лишними знаниями.

Поэтому более феншуйно делать через события. У человека будет событие "переезд", кот должен подписаться на него и слушать. В случае переезда - самостоятельно идти вслед за хозяином. Но это сложнее.
1
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
02.10.2020, 12:42
Лучший ответ Сообщение было отмечено VetalM как решение

Решение

Python
1
2
3
4
5
class Man:
    ...
    def take_cat(self, cat):
        cat.house = self.house
    ...
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
02.10.2020, 16:37
VetalM, Начать нужно с того, что описать все словами в виде рассказа про человека живущего в доме и про кота. А потом уже реализовать этот рассказ в виде модели искусственного интеллекта на питоне.
Напишите рассказ, Вам помогут оформить его в виде макета на питоне.

Добавлено через 3 минуты
В доме <по такому-то адресу> живет <имя> ... и так далее.

Добавлено через 14 минут
При описании класса описываются все свойства и методы общие для экземпляров этого класса. Что, все коты имеют свойство дом? Существуют дикие коты, у которых вообще отсутствует такое понятие как дом, в том смысле, как мы определяем дом (с адресом) для человека. Если кот живет в доме у человека, то это не свойство всех котов, а свойство отдельного экземпляра класса котов.
В общем пишите рассказ, потом будем разбираться.

Добавлено через 14 минут
Разовые события не являются атрибутами класса, это атрибуты конкретного экземпляра.
1
1 / 1 / 0
Регистрация: 30.03.2020
Сообщений: 42
02.10.2020, 17:35  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Начать нужно с того, что описать все словами в виде рассказа про человека живущего в доме и про кота. А потом уже реализовать этот рассказ в виде модели искусственного интеллекта на питоне.
Вы конечно развернули интересную тему, но до ИИ я еще не дошел. Сейчас учу ООП.
Задача - сделать все классами и объектами, чтобы понять как они работают и взаимодействуют.
События выполняются рандомно или по условиям.

Цитата Сообщение от КулХацкеръ Посмотреть сообщение
class Man:
    ...
    def take_cat(self, cat):
        cat.house = self.house
    ...
Спасибо, отличное решение.

Цитата Сообщение от dondublon Посмотреть сообщение
Поэтому более феншуйно делать через события.
Спасибо, но до таких решений я еще не доучился.
Цитата Сообщение от dondublon Посмотреть сообщение
Именно. Как-то же надо присвоить дом коту на непосредственном уровне.
КулХацкеръ, подсказал простое решение. Сделаю и так как посоветовали вы, чтобы понять как работаю оба варианта. Спасибо!
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
03.10.2020, 03:29
VetalM,
Цитата Сообщение от VetalM Посмотреть сообщение
но до ИИ я еще не дошел. Сейчас учу ООП.
И так. Что такое искусственный интеллект? Это моделирование мышления человека. А что такое ООП? Это тоже моделирование мышления человека. Просто существуют различные технологии реализации ИИ. Как то нейронные сети, а еще до них существуют и другие технологии ИИ. Существуют беспилотные автомобили, а на днях показывали, что уже есть беспилотные сельскохозяйственные комбайны. И те и другие управляются с помощью ИИ. ООП это тоже технология ИИ (хотя некоторые и пытаются использовать классы формально, как некоторые формальные структуры, работающие по определенным правилам. Но с таким подходом больших успехов в ООП не достичь).
Однако описать полностью мышление человека не реально (по крайней мере в обозримом будущем), поэтому ИИ моделирует работу мозга в упрощенном варианте.
Вернемся к Вашей задаче.
Основное в понимании класса и ООП частью которого он является, это в том числе понимание что такое в ООП self.
Класс, это объединение множества объектов обладающих некоторыми общими свойствами. self обозначает обобщенный объект из этого множества объектов. Если мы описываем класс, то любой конкретный экземпляр этого класса, можно подставить внутрь определения этого класса вместо self , и для него будет применимо все, что применимо для self в определении этого класса. Если мы описываем класс Человек, то любой человек должен обладать всеми теми свойствами, которые описаны в этом классе. И в свою очередь, любой объект, который имеет все те атрибуты, которые описаны в этом классе, будет принадлежать этому классу.
Цитата Сообщение от КулХацкеръ Посмотреть сообщение
class Man:
...
def take_cat(self, cat):
cat.house = self.house
Такое описание класса предполагает, что все люди если берут к себе кота, то для кота, дом человека становится домом кота. Учитывая, что кошки , это домашние животные, которые живут в доме хозяина, то такой метод для любого человека, если он берет к себе кота, является общим действием (методом) для любого человека. Поэтому такой метод для класса человек, является правильным. КулХацкеръ, Вам подсказал верно. Но определять свойство дом, для любого кота, это не правильно, так как не все экземпляры класса Кошка имеют свойство дом. Этот атрибут получают только те экземпляры класса Кошки, которых человек берет к себе домой. Поэтому атрибут дом появляется у кота, только когда вызывается метод человека take_cat и в этом методе экземпляру кота присваивается новый атрибут house и его значение в виде адреса дома. Это реализуется с помощью инструкции присваивания cat.house = self.house[/quote]
Именно в этот момент, у конкретного экземпляра кота, появится атрибут дом. Аналогично, человек должен иметь метод "Назвать кота", который этому экземпляру кота даст атрибут name и его конкретное значение. Кошки не имеющие хозяев, не имеют имен. Поэтому name не является атрибутом класса Кошек. Этот атрибут появляется у конкретного экземпляра только потом, когда кота берет к себе хозяин.
Но что тогда писать в классе Cat ? Можно было бы описать общие свойства для всех котов. Подкласс кошачий, четыре ноги два уха, хищник, цвет и так далее. Но все эти свойства для Вашей задачи не важны. Поэтому для упрощения, стоит определить только одно свойство "Вид животного" и его значение "кошка". Хотя можно определить еще такие свойства, как
"пол" и "возраст", которые присущи всем экземплярам класса "Кошки" и потому могут быть описаны в классе.
Это не все, что можно рассказать про ООП и классы, но это важно понимать при программировании с использованием ООП.

PS.
При мышлении у человека могут возникать несколько вариантов решения. И в Вашей задаче возможны различные подходы. Можно «взять кота» разместить в описании класса, так как все люди, когда берут кота, то делают домом кота свой дом и дают коту имя. Но можно определить эти действия, как индивидуальные действия (события) именно для этого экземпляра человека. Тогда это действие описывается для этого экземпляра человека вне класса. Можно и так и так, но более соответствует реальности описать внутри класса, так как так поступают все, за очень редким исключением. И тогда только для этих экземпляров , относящихся к этим редким исключениям, описывать свои исключительные методы (но вне описания класса).
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
03.10.2020, 11:02
Цитата Сообщение от Viktorrus Посмотреть сообщение
И так. Что такое искусственный интеллект? Это моделирование мышления человека. А что такое ООП? Это тоже моделирование мышления человека.
OMG. Задача - написать примитивную группу объектов. Надо ж было додуматься приплести сюда ИИ.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
03.10.2020, 15:14
Цитата Сообщение от dondublon Посмотреть сообщение
OMG. Задача - написать примитивную группу объектов. Надо ж было додуматься приплести сюда ИИ.
OMG Видно что у Вас смутное представление об ИИ. Я в МИРЭА по специализации "Искусственный интеллект" целый год изучал технологии проектирования ИИ. И потом на практике сталкивался с этими технологиями.
Поэтому не вижу смысла продолжать дискуссию. Удачи.

Добавлено через 2 часа 36 минут
VetalM, В принципе Ваш код работает и добавка от КулХацкеръ, решает Вашу проблему.
Интересно у Вас работает Петя. У него нет постоянной работы и он находит работу от случая к случаю.
Хотя принципы ООП у Вас соблюдены не полностью. Из Вашего кода следует, что все люди как правило не имеют постоянной работы, так как именно такой режим работы заложен в метод деятельность человека, который определен в классе людей.
Мне кажется Вы не совсем понимаете разницы между атрибутами, присущими всем экземплярам класса, описываемыми в классе как атрибуты объекта self, и атрибутами конкретного экземпляра класса присущими только ему.
Желаю успехов в освоении ООП.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
03.10.2020, 15:40
Цитата Сообщение от Viktorrus Посмотреть сообщение
OMG Видно что у Вас смутное представление об ИИ. Я в МИРЭА по специализации "Искусственный интеллект" целый год изучал технологии проектирования ИИ. И потом на практике сталкивался с этими технологиями.
Поэтому не вижу смысла продолжать дискуссию. Удачи.
В таком случае, у вас hammer problem. Человеку, который только что научился работать молотком, всюду чудятся гвозди.
ИИ - это действиельно моделирование мышления. Но ООП тут даже близко не стояло. ООП - моделирование объектов предметной области, а отнюдь не мышления.

Вам также всего доброго
0
1 / 1 / 0
Регистрация: 30.03.2020
Сообщений: 42
03.10.2020, 18:48  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Интересно у Вас работает Петя. У него нет постоянной работы и он находит работу от случая к случаю.
Изначально он работает когда нужны деньги, сейчас переработал код, чтобы он выходил на работу случайно.
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# -*- coding: utf-8 -*-
 
from random import randint
 
from termcolor import cprint
 
 
class Cat:
    def __init__(self, name):
        self.name = name
        self.cat_fullness = 50
        self.house = None
 
    def __str__(self):
        return f"{self.name}, сытость: {self.cat_fullness}"
 
    def scratch_walls(self):
        cprint(f'{self.name} поцарапал стены', color='blue')
        self.house.mud += 50
        self.cat_fullness -= 20
 
    def sleep(self):
        cprint(f'{self.name} поспал', color='blue')
        self.cat_fullness -= 10
 
    def eat(self):
        if self.house.cat_food >= 10:
            cprint(f'{self.name} поел', color='yellow')
            self.cat_fullness += 20
            self.house.cat_food -= 10
        else:
            self.cat_fullness -= 10
            cprint(f'{self.name} нет еды', color='red')
 
    def act(self):
        if self.cat_fullness <= 0:
            cprint(f'{self.name} сдох...', color='red')
            return
        action = randint(1, 2)
        if self.cat_fullness < 20:
            self.eat()
        elif action == 1:
            self.sleep()
        elif action == 2:
            self.scratch_walls()
 
 
class Man:
 
    def __init__(self, name):
        self.name = name
        self.fullness = 50
        self.house = None
 
    def __str__(self):
        return f"{self.name}, сытость: {self.fullness}"
 
    def eat(self):
        if self.house.food >= 10:
            cprint(f'{self.name} поел', color='yellow')
            self.fullness += 10
            self.house.food -= 10
        else:
            cprint(f'{self.name} нет еды', color='red')
 
    def work(self):
        cprint(f'{self.name} сходил на работу', color='blue')
        self.house.money += 150
        self.fullness -= 10
 
    def watch_tv(self):
        cprint(f'{self.name} смотрел телевизор', color='blue')
        self.house.money -= 10
        self.fullness -= 10
 
    def clean(self):
        cprint(f'{self.name} убрал грязь в доме', color='blue')
        self.house.mud = 0
        self.fullness -= 10
 
    def cat_shopping(self):
        if self.house.money >= 50:
            cprint(f'{self.name} сходил в магазин за едой для котов', color='magenta')
            self.house.money -= 50
            self.house.cat_food += 100
        else:
            cprint(f'{self.name} деньги кончились!', color='red')
 
    def shopping(self):
        if self.house.money >= 50:
            cprint(f'{self.name} сходил в магазин за едой', color='magenta')
            self.house.money -= 50
            self.house.food += 50
        else:
            cprint(f'{self.name} деньги кончились!', color='red')
 
    def go_to_the_house(self, house):
        self.house = house
        self.fullness -= 10
        cprint(f'{self.name} въехал в дом номер {my_home.number}', color='cyan')
 
    def take_cat_in_the_house(self, cat):
        cat.house = self.house
        cprint(f'{self.name} взял в дом номер {my_home.number} кота {cat.name}', color='cyan')
 
    def act(self):
        if self.fullness <= 0:
            cprint(f'{self.name} умер...', color='red')
            return
        action = randint(1, 6)
        if self.fullness < 20:
            self.eat()
        elif self.house.money < 50:
            self.work()
        elif self.house.food < 10:
            self.shopping()
        elif action == 1:
            self.work()
        elif action == 2:
            self.eat()
        elif action == 3:
            self.clean()
        elif action == 4:
            self.cat_shopping()
        else:
            self.watch_tv()
 
 
class House:
 
    def __init__(self, number):
        self.number = number
        self.food = 10
        self.money = 0
        self.cat_food = 30
        self.mud = 0
 
    def __str__(self):
        return f'В доме номер "{my_home.number}" еды: {self.food}, еды для кота: {self.cat_food}, денег: {self.money}, грязь: {self.mud}'
 
 
citizen = Man(name='Петя')
 
cats = [
    Cat(name='Пушок'),
    Cat(name='Барсик'),
    Cat(name='Мурчик'),
]
my_home = House(771)
citizen.go_to_the_house(my_home)
 
for cat in cats:
    citizen.take_cat_in_the_house(cat)
 
for day in range(1, 366):
    print(f'================ день {day} ==================')
    citizen.act()
    for cat in cats:
        cat.act()
    print('--- в конце дня ---')
    print(citizen)
    for cat in cats:
        print(cat)
    print(my_home)
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
04.10.2020, 02:34
VetalM, Хотел написать свой вариант для решения Вашей задачи, в качестве примера как с помощью ООП моделировать мыслительный процесс человека. В реальном мире не существует таких объектов как класс и self. Это объекты нашего мышления. Класс, это собирательный образ, формируемый нашим сознанием, множества объектов реального мира, которые имеют общие свойства. Он оформляется как объект мышления, которому присваивается имя. Особенность этого объекта (множества) заключается в том, что мы не наблюдаем все реальные объекты этого множества одновременно, а в процессе рассмотрения реальных объектов причисляем их или нет к этому множеству. То есть рассмотрение реальных объектов принадлежащих этому множеству происходит в нашем сознании динамически.
Теперь рассмотрим, что такое self . Реального объекта соответствующему ему не существует. Это динамически изменяющийся объект в нашем сознании. Например для класса "Яблоко", self это как непрерывный перебор в нашем сознании образов реальных яблок, как бы динамический просмотр киноленты кадров с реальными яблоками. Я это называю обобщенным объектом. Для класса "Яблоко", это будет не конкретное некоторое яблоко, а понятие яблока вообще. Говоря о яблоке абстрактно, вы непроизвольно начинаете перебирать в уме конкретные яблоки. И в сравнении определять общие свойства , которые присущи любому реальному яблоку. Таким перебором мы создаем класс, который описывает свойства принадлежащие любому реальному яблоку. И такое абстрактное (сформированное в нашем сознании) яблоко мы называем объектом self в нашем классе "Яблоко" . То есть объект self в классе "Яблоко" будет иметь только те свойства, которые присущи всем реальным яблокам. И в нем не будет свойств присущих только отдельным экземплярам яблок, но не всем.
И такой абстрактный объект я называю обобщенным понятием яблока и именно этот абстрактный объект обозначается в классе "Яблоко" как self. Аналогично self используется и в других классах, для обозначения своих абстрактных объектов.
Извините за многословие, короче не получилось. Именно это не понимают те, кто не видит, что ООП описывает мыслительный процесс человека и потому является инструментом для моделирования мышления человека. А это значит является одним из инструментов, используемым при создании "Искусственного интеллекта".

Добавлено через 19 минут
Цитата Сообщение от Viktorrus Посмотреть сообщение
Хотел написать свой вариант для решения Вашей задачи, в качестве примера как с помощью ООП моделировать мыслительный процесс человека.
Извините отвлекся. Так вот, из за того, что Ваша задача не 10 строк, я было отказался от этой идеи. Но посмотрю, если соберусь, то попробую написать свой вариант решения Вашей задачи.
Но для этого сначала нужно описать всю задачу словами, то есть словами оформить мыслительный процесс описывающий реальность (сконструированную реальность), Затем создать алгоритм решения данной задачи. И после этого с помощью ООП и питона написать код являющийся моделью мыслительного процесса описывающего эту сконструированную реальность.
То есть этот код будет моделировать мыслительный процесс решения данной задачи. Это и называется ИИ.
Не обещаю, но может соберусь и сделаю. Смотря как будет со временем.
Здесь будет нужен не просто код, а в том числе подробное объяснение процесса создания этого кода. Что бы решение этой задачи могло быть обучающим примером.
1
1 / 1 / 0
Регистрация: 30.03.2020
Сообщений: 42
05.10.2020, 09:16  [ТС]
Добрый день. Было бы интересно посмотреть как выглядит и работает этот код.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
05.10.2020, 22:47
Пример ООП.
Начал с написания ТЗ (технического задания) в виде "Постановки задачи" (ПЗ), необходимой для написания кода.
Вот первый вариант ПЗ.
Исходное задание:
“””# Необходимо создать класс кота. У кота есть атрибуты - сытость и дом (в котором он живет).
# Кот живет с человеком в доме.
# Для кота дом характеризируется - миской для еды и грязью.
# Изначально в доме нет еды для кота и нет грязи.

# Доработать класс человека, добавив методы
# подобрать кота - у кота появляется дом.
# купить коту еды - кошачья еда в доме увеличивается на 50, деньги уменьшаются на 50.
# убраться в доме - степень грязи в доме уменьшается на 100, сытость у человека уменьшается на 20.
# Увеличить кол-во зарабатываемых человеком денег до 150 (он выучил пайтон и устроился на хорошую работу

# Кот может есть, спать и драть обои - необходимо реализовать соответствующие методы.
# Когда кот спит - сытость уменьшается на 10
# Когда кот ест - сытость увеличивается на 20, кошачья еда в доме уменьшается на 10.
# Когда кот дерет обои - сытость уменьшается на 10, степень грязи в доме увеличивается на 5
# Если степень сытости < 0, кот умирает.
# Так же надо реализовать метод "действуй" для кота, в котором он принимает решение
# что будет делать сегодня

# Человеку и коту надо вместе прожить 365 дней.
Усложненное задание (делать по желанию):
# Создать несколько (2-3) котов и подселить их в дом к человеку.
# Им всем вместе так же надо прожить 365 дней.

# (Можно определить критическое количество котов, которое может прокормить человек...)
”””
Начинаем с написания технического задания (постановка задачи).
С помощью мыслительного процесса, и взяв за основу исходное задание, описать события (действия), которые совершает Петя. В результате опишем пример, который должен соответствовать реальности (как бы это было в реальности).
Степень приближения к реальности зависит от глубины проработки. Неизбежно упрощение, так как точно описать реальность невозможно (из-за слишком большого объема информации).
Петя живет в доме номер 815.
Так как в задании # Увеличить кол-во зарабатываемых человеком денег до 150 (он выучил пайтон и устроился на хорошую работу ,
то у Пети есть постоянная работа (под «устроился» подразумевают постоянную работу), приносящая ежедневно денег 150.
Как проходит день у Пети. Должен быть в виде функции за пределами класса, так как распорядок дня у каждого человека (у каждого экземпляра класса Man) свой:
В течение дня
1) Если Петя голодный и «сытость» у него становится <= 0, то он умирает.
2) В противном случае, если он еще живой и «сытость» < 20 , и в доме есть еда, то он ест. В исходном коде написано неправильно, он там ест один раз, восстанавливая 10 сытости. Хотя в реальности он должен есть пока не наестся, пока сытость не станет = 50. Не вижу причин, почему он должен быть полуголодным, если у него есть деньги на еду.
Если еды нет, но есть деньги, то он ее покупает и ест, пока не наестся.
3) Петя идет работать
4) По окончании работы получает зарплату за день.
5) Если запасов еды в доме не достаточно < 30, то он идет в магазин, Так как в день он тратит 30 сытости. Нужно иметь > 20 запаса еды, на восстановление потраченной за день сытости.
6) Если не достаточно корма, то идет за кормом котам. (Это действие только тогда, когда у него есть коты). То есть последовательность действий у Пети будет разная для случаев, когда у него есть коты, и когда у него нет котов. Так как наличие котов присуще не всем людям, то действия связанные с котами не должны быть методами внутри класса, а описываться функциями вне класса.
7) Если пополнять запасы еды не нужно, то он случайным образом выбирает одно из занятий: убирает грязь, смотрит телевизор.
Петя взял себе котенка мужского пола и назвал его Пушком.
Петя решил взять к себе нескольких котов. Но для того, что бы определить скольких котов он сможет прокормить на свою зарплату решил брать по одному коту, что бы посмотреть, по балансу, скольких котов он потянет по деньгам.
В задаче мы видим объекты трех основных классов: человек (Man), кот (Cat), дом (House), описывающий дома, в котором живет и в котором будет жить Петя с котами.
Начнем с того, что опишем эти классы.
Затем напишем код, моделирующий действия Пети, которые описаны выше в постановке задачи.
При постановке задачи стало ясно, что Основное задание составлено неверно. Например не все люди имеют котов, и поэтому включать в класс Man всего, что связано с котом, является ошибкой. Действия связанные с котом, являются индивидуальными для экземпляра класса petya (Петя).
Да и вообще распорядок дня act индивидуален для каждого человека. Поэтому он не может описываться в виде метода внутри класса Man. Его нужно оформлять в виде функции за пределами класса. И так далее.
Составив ТЗ (техническое задание), в виде ПЗ (постановки задачи) для написания кода, можно начинать писать код.
Начну не спеша, когда напишу, то выложу сюда.
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
08.10.2020, 17:53
Цитата Сообщение от VetalM Посмотреть сообщение
Было бы интересно посмотреть как выглядит и работает этот код.
Выкроил время, что бы написать код. Так как для примера, то рассматривал сценарий с одним котом и с постоянной работой. Хотя в этом случае отличия не большие.
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
from random import randint
 
class Man:
    # класс людей
    def __init__(self, name, fullness = 50, house = None):
        self.name = name
        self.fullness = fullness      # сытость-показывает запас здоровья
        self.house = house            # дом (экземпляр класса)
 
    def __str__(self):
        return f"{self.name}, сытость: {self.fullness}"  # будет использоваться для print(inst)
                                                         # где inst, является экземпляром класса
    def eat(self):
        # прием пищи (еда) для востановления сытости
        if self.house.food >= 10:
            print(f'{self.name} поел')
            self.fullness += 10
            self.house.food -= 10
        else:
            print(f'{self.name} нет еды')
 
    def work(self):
        # выполнение работы (при наличии постоянной работы)
        print(f'{self.name} сходил на работу')
        self.house.money += 150
        self.fullness -= 10
 
    def watch_tv(self):
        # просмотр телевизора
        print(f'{self.name} смотрел телевизор')
        self.house.money -= 10
        self.fullness -= 10
 
    def clean(self):
        # уборка в доме
        print(f'{self.name} убрал грязь в доме')
        self.house.mud = 0
        self.fullness -= 10
 
    def shopping(self):
        # поход в магазин за продуктами
        if self.house.money >= 50:
            print(f'{self.name} сходил в магазин за едой')
            self.house.money -= 50
            self.house.food += 50
        else:
            print(f'{self.name} деньги кончились!')
 
    def go_to_the_house(self, house):
        # заселение в дом
        self.house = house
        self.fullness -= 10
        print(f'{self.name} въехал в дом номер {self.house.number}')
 
class House:     # дом хранит информацию о наличие ресурсов
    def __init__(self, number, food = 0, money = 0, mud = 0):
        self.number = number
        self.food = food
        self.money = money
        self.mud = mud
 
    def __str__(self):
        return f'В доме номер "{self.number}" еды: {self.food}, денег: {self.money}, грязь: {self.mud}'
 
class Cat:         # класс котов
    def __init__(self, name, cat_fullness = 50, house = None):
        self.name = name
        self.cat_fullness = cat_fullness     # сытость (здоровье кота)
        self.house = house                   # дом домашнего кота
 
    def __str__(self):
        return f"{self.name}, сытость: {self.cat_fullness}"
 
    def scratch_walls(self):
        print(f'{self.name} поцарапал стены')
        self.house.mud += 50
        self.cat_fullness -= 20
 
    def sleep(self):
        print(f'{self.name} поспал')
        self.cat_fullness -= 10
 
    def eat(self):
        if self.house.cat_food >= 10:
            print(f'{self.name} поел')
            self.cat_fullness += 20
            self.house.cat_food -= 10
        else:
            self.cat_fullness -= 10
            print(f'{self.name} нет еды')
 
class Man_with_cat(Man): # класс людей имеющих котов
 
    def __init__(self, name, fullness, house):
        self.name = name
        self.fullness = fullness
        self.house = house
 
    def __str__(self):
        return f"{self.name}, сытость: {self.fullness}"
 
    def eat(self):
        if self.house.food >= 10:
            print(f'{self.name} поел')
            self.fullness += 10
            self.house.food -= 10
        else:
            print(f'{self.name} нет еды')
 
    def work(self):
        print(f'{self.name} сходил на работу')
        self.house.money += 150
        self.fullness -= 10
 
    def watch_tv(self):
        print(f'{self.name} смотрел телевизор')
        self.house.money -= 10
        self.fullness -= 10
 
    def clean(self):
        print(f'{self.name} убрал грязь в доме')
        self.house.mud = 0
        self.fullness -= 10
 
    def cat_shopping(self):
        if self.house.money >= 50:
            print(f'{self.name} сходил в магазин за едой для котов')
            self.house.money -= 50
            self.house.cat_food += 100
        else:
            print(f'{self.name} деньги кончились!')
 
    def shopping(self):
        if self.house.money >= 50:
            print(f'{self.name} сходил в магазин за едой')
            self.house.money -= 50
            self.house.food += 50
        else:
            print(f'{self.name} деньги кончились!')
 
    def go_to_the_house(self, house):
        self.house = house
        self.fullness -= 10
        print(f'{self.name} въехал в дом номер {my_home.number}')
 
    def take_cat_in_the_house(self, cat):
        cat.house = self.house
        print(f'{self.name} взял в дом номер {self.house.number} кота {cat.name}')
 
 
class House_with_cat(House):
    def __init__(self, number, food, money, mud, cat_food=30):
        self.number = number
        self.food = food
        self.cat_food = cat_food
        self.money = money
        self.mud = mud
 
    def __str__(self):
        return f'В доме номер "{self.number}" еды: {self.food}, еды для кота: {self.cat_food}, денег: {self.money}, грязь: {self.mud}'
    
def citizen_daily_act():
    # распорядок дня вынесен за пределы класса Man, так как распорядок индивидуален для каждого человека.
    if citizen.fullness <= 0:
        print(f'{citizen.name} умер...')
        return
    action = randint(1, 3)
    while citizen.house.food >= 10 and citizen.fullness < 50:
        citizen.eat()
    citizen.work()
    if citizen.house.food < 10:
        citizen.shopping()
    action = randint(1, 2)
    if action == 1:
        citizen.clean()
    else:
        citizen.watch_tv()
 
def citizen_daily_act_with_cat():
    # распорядок дня при наличие кота
    if citizen.fullness <= 0:
        print(f'{citizen.name} умер...')
        return
    while citizen.house.food >= 10 and citizen.fullness < 50:
        citizen.eat()
    citizen.work()
    if citizen.house.food < 10:
        citizen.shopping()
    if citizen.house.cat_food <= 20:
        citizen.cat_shopping()
    action = randint(1, 2)
    if action == 1:
        citizen.clean()
    else:
        citizen.watch_tv()
 
def cat_daily_act():    # события у кота в течение дня
    if cat.cat_fullness <= 0:
        print(f'{self.name} сдох...')
        return
    #action = randint(1, 2)
    while cat.house.cat_food >= 10 and cat.cat_fullness < 50:
        cat.eat()
    action = randint(1, 2)
    if action == 1:
        cat.sleep()
    elif action == 2:
        cat.scratch_walls()
 
if __name__ == '__main__':
 
    citizen = Man(name='Петя')          # человек Петя
    my_home = House(771)                # Пете дали дом
    citizen.go_to_the_house(my_home)    # Петя заселился в дом
    setattr(citizen, 'act', citizen_daily_act)  # установлен атрибут act (без кота) 
 
    for day in range(1, 4):
        print(f'================ день {day} ==================')
        citizen.act()
        print('--- в конце дня ---')
        print(citizen)
        print(my_home)
 
    # Петя решил стать кошатником. Сохраняем текущие данные.
    # Создаем экземпляр класса кошатников и заносим текущие данные в новый экземпляр
    name, fullness, house = citizen.name, citizen.fullness, citizen.house # текущая информация
                                                                          # о Пете
    citizen = Man_with_cat(name, fullness, house) # теперь Петя относится к тем, кто держит кота
    setattr(citizen, 'act', citizen_daily_act_with_cat)  # установлен атрибут act (с котом) 
 
    # Сохраняем текущие данные экземпляра класса House.
    # Создаем экземпляр класса House_with_cat и заносим текущие данные в новый экземпляр
    number, food, money, mud = my_home.number, my_home.food, my_home.money, my_home.mud
    my_home = House_with_cat(number, food, money, mud)
    citizen.house = my_home   # оборудуем дом Пети для проживания кота,
                              # (значением citizen.house становится экземпляр класса House_with_cat)
 
    cat = Cat(name="Пушок")             # Петя нашел кота и назвал его Пушок
 
    citizen.take_cat_in_the_house(cat)
    setattr(cat, 'act', cat_daily_act)
 
    for day in range(1, 366):
        print(f'================ день {day} ==================')
        citizen.act()
        cat.act()
        print('--- в конце дня ---')
        print(citizen)
        print(cat)
        print(my_home)
Основных же отличий два.
1) Класс описывает только общие для всех экземпляров этого класса атрибуты (свойства и методы)
Так как не все люди имеют котов, то в класс Man нельзя включать свойства и методы связанные с котами.
Хотя, если рассматривать класс только таких людей, которые имеют котов, то можно обойтись одним классам, но для
ясности назвав его Man_with_cat .
У меня в качестве учебного примера рассматриваются два класса, Man , людей которые не имеют котов и Man_with_cat ,
людей которые имеют котов. Поэтому я смог разделить код на жизнь без кота и на жизнь с котом. И в моем коде
показано, как перейти от состояния жизни без кота, к состоянию жизни с котом.
2) Второе основное отличие от Вашего кода, это то, что в моем примере проводится четкое различие от методов (атрибутов)
которые принадлежат всем экземплярам класса и потому описываются в классе, и методами (атрибутами), которые
принадлежат только некоторым конкретным экземплярам класса и потому выносятся за пределы класса в виде функций и
устанавливаются для конкретных экземпляров класса за пределами классса с помощью функции setattr() .
В нашем примере расписание дня для каждого человека разное (у каждого своя жизнь), поэтому метод act() неправильно
описывать в классе. Поэтому я вынес этот метод за пределы класса и добавляю соответствующие наличию кота методы
в качестве атрибутов для экземпляров человек (без кота) и человек с котом.

Кстати забыл сказать, один и тот же человек в нашем случае сначало принадлежит к классу человек (без кота), а затем берет себе кота, и начинает принадлежать другому классу, человек с котом. У меня эта проблема решается следующим образом. Я в нужный момент создаю новый экземпляр, но уже класса человек с котом, и передаю текущие данные от экземпляра человек(без кота) к экземпляру человек с котом, подразумевая, что это один и тот же человек но изменивший качество( свою принадлежность к соответствующему классу).
Вот вроде все, что будет не понятно, спрашивайте.

Добавлено через 16 минут
VetalM, По ходу написания кода я пришел к следующим выводам. Описать реальный процесс мышления человека, то есть создать ИИ строго соответствующий реальности, мало вероятно. Поэтому в любом случае придется упрощать описание реальности. Чем проще математическая модель тем она меньше соответствует реальности, но тем ее проще реализовать и так же будет выше ее производительность (скорость работы). Поэтому для каждой конкретной задачи нужно выбирать свою золотую середину, приемлемую для конкретного случая.
Поэтому для вашей задачи вполне подходит Ваш вариант, а мой для вашего случая слишком тяжеловат.
Мой Вариант я написал, что бы продемонстрировать возможности ООП в моделировании реального мышления человека.
И может быть кому то пригодятся используемые мной приемы (не притененную для них на авторство, вполне возможно они у кого то описаны, может у того же Лутца).
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
08.10.2020, 18:37
Viktorrus, плохо.
Не знаю, как у вас с ИИ, но ООП - на тройку с минусом.
Кроме того, непонятно, при чём же тут всё-таки ИИ. Не вижу тут моделирования мышления. Моделирование людей, котов и домов с их соотношениями вижу (абсолютно неквалифицированное, но это уже другой вопрос).
А моделирование мышления - нет.
0
1 / 1 / 0
Регистрация: 30.03.2020
Сообщений: 42
09.10.2020, 14:46  [ТС]
Viktorrus, подскажите, зачем в дочернем классе Man_with_cat дублировать методы класса Man? Вроде там можно добавить только методы take_cat_in_the_house, cat_shopping.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
09.10.2020, 15:23
VetalM, Хочу пояснить про связь ООП и ИИ. ООП это всего лишь одна из технологий используемой при проектировании ИИ, но одной этой технологии не достаточно. Для ИИ важно использовать нечеткую логику, так как именно с нечеткой логикой работает наше сознание. В реальном мышлении обычно для каждого события используется вероятность его появления. Правда при этом мы не оперируем процентами вероятности, а вероятность оцениваем интуитивно, используя понятия больше, меньше. Так же при проектировании ИИ используются одновременно еще и другие технологии.
Но для нас важно понимать, что в программирование ООП пришло из работ связанных с ИИ. Поэтому нужно это понимать, что бы осмысленно использовать ООП в питоне. С теми, кто это не понимает, я в дискуссии не вступаю, так как они все равно этого не поймут. И поэтому все на что они способны, это устраивать базар, делая утверждения и не утруждая себя доказательствами для этих утверждений (принципы базарной ругани).
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
09.10.2020, 15:27
VetalM, незачем
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.10.2020, 15:27
Помогаю со студенческими работами здесь

Экземпляры формы
Подскажите пожайлуста! Как открыть несколько экземпляров одной формы, но с разными источниками данных? И как потом обратиться к каждому...

Экземпляры в радиусе
Столкнулся с проблемой, нужно отслеживать все объекты входящие в радиус 2D. Пробовал так Collider2D _en =...

экземпляры класса
По лабе надо написать консольное приложение, что то вроде базы данных студентов, пишу я и столкнулся с такой проблемой: при добавлении...

Экземпляры класса
Здравствуйте! Я затупил и не могу понять такую вещь) Вот есть у меня, например, класс CRUD, он занимается манипуляциями с данными из БД....

Экземпляры Oracle12W
День добрый, подскажите как реализовать данный вопрос, пожалуqста: &quot;Выполните запрос к ORA12W, позволяющий получить перечень...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru