0 / 0 / 0
Регистрация: 08.03.2019
Сообщений: 25

Использовать метод одного класса в другом

14.01.2020, 20:52. Показов 4491. Ответов 4

Студворк — интернет-сервис помощи студентам
Добрый день, подскажите, как решить проблему.
Имеются класс Cat, класс Human, класс House.
Необходимо реализовать возможность проверки еды в доме (за еду отвечает класс House), если еда меньше какого-то количества, то пойти и купить ее(за покупку отвечает класс Human).
За все действия отвечает класс Cat

Спасибо Вам за помощь

Программа в двух словах
Кликните здесь для просмотра всего текста
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
class Cat:
    def __init__(self, cat_name):
        self.cat_name = cat_name
        self.cat_fullness = 30
        self.cat_house = None
 
    def __str__(self):
        return f'I am {self.cat_name}, fullness - {self.cat_fullness}, ' + (
            f'I live in {self.cat_house.house_name}' if self.cat_house is not None else 'I\'m homeless.')
 
    def act(self):
        if self.cat_house.food <= 10:
            #Как я могу сюда вызвать метод buy_food из класса Human 
 
class Human:
    def __init__(self, human_name):
        self.human_name = human_name
        self.human_fullness = 100
        self.money = 50
        self.cat = None
        self.human_house = None
        self.check_in(House('the initial house'))
 
    def __str__(self):
        return f'I am {self.human_name}, money - {self.money}, fullness - {self.human_fullness}, ' \
               f'I live in {self.human_house.house_name}, ' + (
                   f'I have a cat - {self.cat.cat_name}' if self.cat is not None else 'I have no cat.')
 
    def buy_food(self):
        if self.money < 50:
            print('You don\'t have enough money!')
            return
        print(f'I has buy food for {self.cat.cat_name}')
        self.money -= 50
        self.human_house.food += 50
 
 
class House:
    def __init__(self, house_name):
        self.dirt = 0
        self.food = 0
        self.house_name = house_name
 
    def __str__(self):
        return f'In house food - {self.food}, dirt - {self.dirt}'


Полностью программа с заданием
Кликните здесь для просмотра всего текста
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
# Необходимо создать класс кота. У кота есть аттрибуты - сытость и дом (в котором он живет).
# Кот живет с человеком в доме.
# Для кота дом характеризируется - миской для еды и грязью.
# Изначально в доме нет еды для кота и нет грязи.
 
# Доработать класс человека, добавив методы
#   подобрать кота - у кота появляется дом.
#   купить коту еды - кошачья еда в доме увеличивается на 50, деньги уменьшаются на 50.
#   убраться в доме - степень грязи в доме уменьшается на 100, сытость у человека уменьшается на 20.
# Увеличить кол-во зарабатываемых человеком денег до 150 (он выучил пайтон и устроился на хорошую работу :)
 
# Кот может есть, спать и драть обои - необходимо реализовать соответствующие методы.
# Когда кот спит - сытость уменьшается на 10
# Когда кот ест - сытость увеличивается на 20, кошачья еда в доме уменьшается на 10.
# Когда кот дерет обои - сытость уменьшается на 10, степень грязи в доме увеличивается на 5
# Если степень сытости < 0, кот умирает.
# Так же надо реализовать метод "действуй" для кота, в котором он принимает решение
# что будет делать сегодня
 
# Человеку и коту надо вместе прожить 365 дней.
 
class Cat:
    def __init__(self, cat_name):
        self.cat_name = cat_name
        self.cat_fullness = 30
        self.cat_house = None
 
    def __str__(self):
        return f'I am {self.cat_name}, fullness - {self.cat_fullness}, ' + (
            f'I live in {self.cat_house.house_name}' if self.cat_house is not None else 'I\'m homeless.')
 
    def sleep(self):
        print(f'{self.cat_name} has gone to sleep')
        self.cat_fullness -= 10
 
    def eat(self):
        print(f'{self.cat_name} has eaten')
        self.cat_fullness += 20
        self.cat_house.food -= 10
 
    def tear_up_wallpaper(self):
        print(f'{self.cat_name} has tore up wallpaper')
        self.cat_fullness -= 10
        self.cat_house.dirt += 5
 
 
    def act(self):
        if self.cat_fullness <= 0:
            print(f'{self.cat_name} died...')
        dice = randint(1, 6)
        if self.cat_fullness < 20:
            self.eat()
        elif self.cat_house.food < 10:
            # Нужно здесь вызвать метод buy_food от класса Human 
            # Можно ли это сделать или надо отдельный метод в классе Cat реализовать
        elif dice == 1:
            self.sleep()
        elif dice == 2:
            self.tear_up_wallpaper()
        else:
            if self.cat_house.food >= 10:
                self.eat()
            else:
                self.sleep()
 
 
class Human:
    def __init__(self, human_name):
        self.human_name = human_name
        self.human_fullness = 100
        self.money = 50
        self.cat = None
        self.human_house = None
        self.check_in(House('the initial house'))
 
    def __str__(self):
        return f'I am {self.human_name}, money - {self.money}, fullness - {self.human_fullness}, ' \
               f'I live in {self.human_house.house_name}, ' + (
                   f'I have a cat - {self.cat.cat_name}' if self.cat is not None else 'I have no cat.')
 
    def take_cat(self, cat):
        cat.cat_house = self.human_house
        self.cat = cat
        print(f'I took a cat')
 
    def check_in(self, house):
        self.human_house = house
        if self.cat is not None:
            self.cat.cat_house = house
 
    def buy_food(self):
        if self.money < 50:
            print('You don\'t have enough money!')
            return
        print(f'I has buy food for {self.cat.cat_name}')
        self.money -= 50
        self.human_house.food += 50
 
    def clean_house(self):
        print('I has clean my house')
        if self.human_house.dirt >= 100:
            self.human_house.dirt -= 100
            self.human_fullness -= 20
        else:
            self.human_house.dirt = 0
            self.human_fullness -= 20
 
    def work(self):
        print('I has gone to work')
        self.money += 150
        self.human_fullness -= 20
 
 
class House:
    def __init__(self, house_name):
        self.dirt = 0
        self.food = 0
        self.house_name = house_name
 
    def __str__(self):
        return f'In house food - {self.food}, dirt - {self.dirt}'
 
 
Tom = Cat(cat_name='Tom')
Jack = Human(human_name='Jack')
House_near_Moscow = House(house_name='House near Moscow')
Jack.take_cat(Tom)
Jack.check_in(House_near_Moscow)
for day in range(1, 21):
    print('================= day {} ================'.format(day))
    Tom.act()
    print(Tom)
    print(House_near_Moscow)
 
# Усложненное задание (делать по желанию)
# Создать несколько (2-3) котов и подселить их в дом к человеку.
# Им всем вместе так же надо прожить 365 дней.
 
# (Можно определить критическое количество котов, которое может прокормить человек...)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.01.2020, 20:52
Ответы с готовыми решениями:

Как переменную из одного класса использовать в другом?
Как переменную из одного класса использовать в другом?

Как использовать переменную из одного класса в другом?
У меня есть два класса. Class A к примеру Self.entry = блаблабла Self.name = self.entry.get() Class B Здесь в методе хочу...

Использовать поля одного класса в другом классе
Есть класс Parking() с созданным объектом currentParking1 и интовым полем currentParking1.parkingSpace = 1; Есть класс Car() с созданным...

4
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.01.2020, 05:43
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
class House:
    def __init__(self, house_name):
        self.dirt = 0
        self.food = 0
        self.house_name = house_name
 
 
class Human:
    def __init__(self, human_name):
        self.human_name = human_name
        self.human_fullness = 100
        self.money = 50
        self.cat = None
        self.human_house = House('the initial house')
        
    def is_home_need_food(self, limit=10):
        """
        Необходимо реализовать возможность проверки еды в доме 
        (за еду отвечает класс House), если еда меньше какого-то количества
        """
        return self.human_house.food < limit        
 
        
applejack = Human(human_name='Applejack')
if applejack.is_home_need_food():
    print('нужно купить еду')
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
15.01.2020, 08:18
Jane_Jane, немного добавлю:

1) Зачем в классах переменные содержат название конструктора класса, например Cat имеет переменную cat_name, просто оставьте name. Ведь намного приятнее использовать Cat.name, чем Cat.cat_name.

2) Перекрестные ссылки, чтобы избавиться от кучи функций, связывайте классы, например добавьте в класс Cat, master(хозяин), house(дом) и тогда вы сможете вызывать их методы.

Добавлено через 6 минут
#ADD

Еще лучше в вашем случае использовать @property, т.к. при смене дома например у хозяина, по логике вещей у кота должен тоже поменяться дом.
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
15.01.2020, 08:25
Кстати, согласен. ООП тут как-то боком привязано. Намного нагляднее было бы организовать базу данных с такими сущностями:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class House:
    def __init__(self, name):
        self.name = name
        self.dirt = 0
        self.food = 0
 
class Human:
    def __init__(self, name):
        self.name = name
        self.fullness = 100
        self.money = 50
        self.house = None
 
class Cat:
    def __init__(self, name):
        self.name = name
        self.fullness = 30
        self.house = None
        self.human = None
* справочник домов
* человек, который может жить в доме
* кот, который может жить в доме и у которого может быть хозяин.

Особенности такой реализации:
* у человека и у кота могут быть разные дома
* у одного человека может быть несколько котов.

Добавлено через 51 секунду
* кот может жить в доме, но не иметь хозяина
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
15.01.2020, 09:01
Пример без реализации методов покупки еды и т.д.
Кликните здесь для просмотра всего текста

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
# -*- coding: utf-8 -*-
 
class RIP(Exception):
    """Исключение если кто то умер от голода."""
 
class BUM(Exception):
    """Исключение если кто то стал бомжом."""
 
class Animal:
    """Родительский класс для всех животных."""
    _name = None
    _house = None
    _fullness = 100
 
    def __init__(self, name:str):
        self._name = name
 
    def __str__(self)->str:
        return f"{self.__class__.__name__}(name={self._name})"
 
    @property
    def name(self)->str:
        """Имя. Имя даётся раз и навсегда!"""
        return self._name
 
    @property
    def house(self):
        """Ссылка на хату."""
        return self._house
    
    @house.setter
    def house(self, house:"House"):
        """Метод изменение хаты."""
        self._house = house
 
    @property
    def fullness(self)->int:
        """Методы получения сытости."""
        return self._fullness
 
    @fullness.setter
    def fullness(self, fullness:int):
        """Метод установки значения сытости. Если сытость меньше нуля,
        то будет вызвано исключение RIP. Максимальное значение 100."""
        if fullness < 0: raise RIP(f"{self} - fullness < 0!")
        self._fullness = fullness if fullness < 100 else 100
 
class Cat(Animal):
    _human = None
 
    @property
    def human(self):
        """Ссылка на хозяина."""
        return self._human
    
    @human.setter
    def human(self, human:"Human"):
        """Метод изменение хозяина."""
        self._human = human 
 
class Human(Animal):
    _cat = None
    _money = 100
 
    @property
    def cat(self):
        """Ссылка на кота."""
        return self._cat
 
    @cat.setter
    def cat(self, cat:"Cat"):
        """Метод установки кота."""
        self._cat = cat
        self._cat.human = self
        self._cat.house = self._house
 
    @property
    def money(self)->int:
        """Метод получения количества кеша."""
        return self._money
 
    @money.setter
    def money(self, money:int):
        """Метод установки количества кеша. Если кеш меньше нуля,
        то будет вызвано исключение BUM."""
        if money < 0: raise BUM(f"{self} - money < 0!")
        self._money = money
 
    @property
    def house(self)->str:
        """Переопределение метода."""
        return self._house
 
    @house.setter
    def house(self, house:"House"):
        """Переопределяем метод смены хаты, т.к. по логике вещей
        если мы переежаем, то котика берем с собой, если он есть!"""
        self._house = house
        if self._cat: self._cat.house = house
 
class House:
    _name = None
 
    def __init__(self, name:str):
        self._name = name
 
    def __str__(self)->str:
        return f"House(name={self._name})"
 
    @property
    def name(self)->str:
        """Имя. Которое можно изменять!"""
        return self._name
 
    @name.setter
    def name(self, name:str):
        """Метод смены имени, т.к. своё убежище
        ты можешь называть как тебе угодно."""
        self._name = name
 
 
Tom = Cat("Tom")
Jack = Human("Jack")
 
little_house = House("Little house")
 
# Джек берёт кота, на улице
Jack.cat = Tom
# Дальше он приносит его в свою квартиру
Jack.house = little_house
 
print(f"{Tom}, хозяин - {Tom.human}, хата - {Tom.house}")
# Cat(name=Tom), хозяин - Human(name=Jack), хата - House(name=Little house)
 
# Джек решил переехать в дом побольше
big_house = House("Big house")
Jack.house = big_house
 
print(f"{Tom}, хозяин - {Tom.human}, хата - {Tom.house}")
#Cat(name=Tom), хозяин - Human(name=Jack), хата - House(name=Big house)


Добавлено через 4 минуты
Либо сделать так:

Кликните здесь для просмотра всего текста

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
class Animal:
    """Родительский класс для всех животных."""
    _name = None
    _fullness = 100
 
    def __init__(self, name:str):
        self._name = name
 
    def __str__(self)->str:
        return f"{self.__class__.__name__}(name={self._name})"
 
    @property
    def name(self)->str:
        """Имя. Имя даётся раз и навсегда!"""
        return self._name
 
    @property
    def fullness(self)->int:
        """Методы получения сытости."""
        return self._fullness
 
    @fullness.setter
    def fullness(self, fullness:int):
        """Метод установки значения сытости. Если сытость меньше нуля,
        то будет вызвано исключение RIP. Максимальное значение 100."""
        if fullness < 0: raise RIP(f"{self} - fullness < 0!")
        self._fullness = fullness if fullness < 100 else 100
 
class Cat(Animal):
    _human = None
 
    @property
    def human(self):
        """Ссылка на хозяина."""
        return self._human
    
    @human.setter
    def human(self, human:"Human"):
        """Метод изменение хозяина."""
        self._human = human 
 
    @property
    def house(self):
        """Ссылка на хату."""
        if not self._human: return None
        return self._human.house
    
class Human(Animal):
    _cat = None
    _money = 100
 
    @property
    def cat(self):
        """Ссылка на кота."""
        return self._cat
 
    @cat.setter
    def cat(self, cat:"Cat"):
        """Метод установки кота."""
        self._cat = cat
        self._cat.human = self
 
    @property
    def money(self)->int:
        """Метод получения количества кеша."""
        return self._money
 
    @money.setter
    def money(self, money:int):
        """Метод установки количества кеша. Если кеш меньше нуля,
        то будет вызвано исключение BUM."""
        if money < 0: raise BUM(f"{self} - money < 0!")
        self._money = money
 
    @property
    def house(self):
        """Ссылка на хату."""
        return self._house
    
    @house.setter
    def house(self, house:"House"):
        """Метод изменение хаты."""
        self._house = house
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.01.2020, 09:01
Помогаю со студенческими работами здесь

Не могу использовать переменную с одного класса в другом!
Проблема следующая. Есть три класса Первый главный public class LaunchUrlIndicator { public static void main(String args) { ...

Можно ли использовать объекты одного класса в другом?
И если можно то как? Например если определить это так(предположим что есть два класса - employee и date) class employee { ...

Считать данные с одного класса и использовать их в другом классе
У меня есть два класса в программе - 1. Window Form со всеми контролс и переменными и 2. Асинхронный TCP. Сейчас в TCP можно написать...

Использовать переменную события в другом методе одного класса
Есть метод где я подписываюсь на событие private bool IsCameraRestarted(string ip, int port) { bool result =...

Как использовать значение переменной из одного класса в другом?
Есть у меня класс package maps { import flash.display.MovieClip; import flash.events.Event; public class Level_1...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru