Найти - Пользователи
Полная версия: Работа с классами. Проблемы c self
Начало » Центр помощи » Работа с классами. Проблемы c self
1
Yana
Всем здравствуйте, уважаемые программисты!
Я новенькая в таком занятии, как программирование.
Стала буквально недавно изучать Python и как только решила написать одну из программ с классами, сразу возникли ошибки. Я не до конца поняла логику.

В общем, в программе есть класс Диета (Diet).
В нём соответственно есть 4 метода, включая конструктор __init__.

Я хотела всё сделать круто, чтобы при запуске программы я вводила только 2 числа: дневную норму калорий человека и калорийность того продукта, которого якобы человек собирается скушать.

Ну всё просто . Норма калорий - количество калорий продукта = сколько осталось скушать. Это должно было быть ответом программы при запуске. Но поняла, что я окончательно запуталась с атрибутами. Не понимаю, что куда ставить.


import operator
class Diet(object):
    '''
    Подсчёт калорий
    '''
    def __init__(self,norm_calories,calories_product ):
        self.norm_calories = norm_calories
        self.calories_product = calories_product
    def product(self): # Калорийность продукта
        print('Калорийность продукта:', self.calories_product)
    def man(self, norm_calories): # Норма калорий для человека
        self.norm_calories = norm_calories
        print('Норма калорий человека:', self.norm_calories)
    def result(self): # Подсчёт калорий (норма - калорийность продукта)
        self.calories = operator.sub(self.norm_calories, self.calories_product) # Вычитание
        print('Вам осталось скушать',self.calories,'калорий')
# Основная часть
norm_calories = input('Введите вашу норму калорий:')
Norma = Diet(norm_calories,0)
print('Ваша норма калорий:', norm_calories)
calor_your_product = input('Введите калорийность продукта')
Calor_product = Diet(0,calor_your_product)
print('Калорийность этого продукта = ', calor_your_product)
print(Diet.result()
—-

Где-то я намудрила. Не знаю, как вывести результат так, чтобы мне самой не задавать формулу вычитания в основной части кода, а чтобы метод result всё сделал за меня, обработав 2 предыдущих числа, которые вводит пользователь.
В последней строке в скобках после result требует ввести данные за место self. Но ведь self служит ссылкой на другие объекты.
Я запуталась. Помогите пожалуйста.
Заранее большое спасибо!
terabayt
не очень понятно и не очень правильно
но чтобы работало
class Diet(object):
    '''
    Подсчёт калорий
    '''
    def __init__(self,norm_calories,calories_product = 0):
        self.norm_calories = norm_calories
        self.calories_product = calories_product
    def product(self): # Калорийность продукта
        print('Калорийность продукта:', self.calories_product)
    def man(self, norm_calories): # Норма калорий для человека
        self.norm_calories = norm_calories
        print('Норма калорий человека:', self.norm_calories)
    def result(self): # Подсчёт калорий (норма - калорийность продукта)
        self.calories = self.norm_calories - self.calories_product # Вычитание
        print('Вам осталось скушать',self.calories,'калорий')
# Основная часть
norm_calories = input('Введите вашу норму калорий: ')
Norma = Diet(int(norm_calories))
print('Ваша норма калорий:', norm_calories)
calor_your_product = input('Введите калорийность продукта: ')
Norma.calories_product = int(calor_your_product)
print('Калорийность этого продукта = ', calor_your_product)
Norma.result()
Yana
Спасибо большое.
Только у меня вопрос с self.

Я скопировала ваш код, разобрала.
Переделала оригинальный код, но когда я решила вызвать последнюю функцию Norma.result() у меня, как и раньше, требует ввести self.
У вас же , если заново прописать функцию, self в скобках горит неактивным ( серым цветом), то есть его вводить не надо.
Не понимаю. Сделала так же, как у вас.

Подскажите пожалуйста, что же делать с этим self.

ВАШ код:


МОЙ код:
terabayt
self может быть только в описании класса!
не знаю зачем он подсвечивает, но если вы пропишите там self будет ошибка
практика эт хорошо, но я бы посоветовал еще немного почитать о ооп в пайтоне
что да как…
и последняя строка должна быть
Norma.result()
а не
Diet.result()
Yana
Ой, точно. Спасибо большое!
Буду повнимательней в следующий раз
py.user.next
Yana
Я новенькая в таком занятии, как программирование.
Можно не объяснять, мы это и так видим по коду.

Yana
В нём соответственно есть 4 метода, включая конструктор __init__.
Это не конструктор, а инициализатор. Конструктор создаёт объект (в питоне это __new__() ), тогда как __init__ инициализирует уже созданный. В других языках они часто совмещены в одной конструкции, поэтому их путают.

Yana
Где-то я намудрила.
Главная ошибка в том, что методы класса как вычисляют значения, так и выводят их. Если понадобится вычисленные значения вывести не на экран, а, например, разместить на сайте, то это не получится сделать. Вывод должен быть снаружи класса.
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