Уведомления

Группа в Telegram: @pythonsu

#1 Март 7, 2015 18:29:28

Yana
От: Мурманск
Зарегистрирован: 2015-03-07
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с классами. Проблемы c self

Всем здравствуйте, уважаемые программисты!
Я новенькая в таком занятии, как программирование.
Стала буквально недавно изучать 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 служит ссылкой на другие объекты.
Я запуталась. Помогите пожалуйста.
Заранее большое спасибо!

Офлайн

#2 Март 7, 2015 20:03:26

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Работа с классами. Проблемы c self

не очень понятно и не очень правильно
но чтобы работало

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()



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Март 8, 2015 05:24:32

Yana
От: Мурманск
Зарегистрирован: 2015-03-07
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с классами. Проблемы c self

Спасибо большое.
Только у меня вопрос с self.

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

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

ВАШ код:


МОЙ код:

Прикреплённый файлы:
attachment моя программа.jpg (90,0 KБ)

Офлайн

#4 Март 8, 2015 05:37:00

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Работа с классами. Проблемы c self

self может быть только в описании класса!
не знаю зачем он подсвечивает, но если вы пропишите там self будет ошибка
практика эт хорошо, но я бы посоветовал еще немного почитать о ооп в пайтоне
что да как…
и последняя строка должна быть

Norma.result()
а не
Diet.result()



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Март 8, 2015 05:41:21)

Офлайн

#5 Март 8, 2015 10:14:58

Yana
От: Мурманск
Зарегистрирован: 2015-03-07
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с классами. Проблемы c self

Ой, точно. Спасибо большое!
Буду повнимательней в следующий раз

Офлайн

#6 Март 8, 2015 13:06:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Работа с классами. Проблемы c self

Yana
Я новенькая в таком занятии, как программирование.
Можно не объяснять, мы это и так видим по коду.

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

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



Отредактировано py.user.next (Март 8, 2015 13:08:18)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version