Классы и декораторы

pums

Новичок
Пользователь
Авг 1, 2020
55
0
6
Для начала прошу поправить этот код, чтобы работал без ошибок.
Код:
class gotovka:
    def __init__(self):
        self.dobavki = "перец, майонез"
 
    def buterbrod(self, lomtik):
        print("Берем ломтик хлеба")
        print("Дообавляем сверху ломтик " + self.lomtik)
        print("В качестве приправы добавляем " + self.dobavki)
 
buter_s_vetchinoi = gotovka
buter_s_vetchinoi.buterbrod("ветчины")
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 669
477
83
Python:
class gotovka:
    def __init__(self):
        self.dobavki = "перец, майонез"

    def buterbrod(self, lomtik):
        print("Берем ломтик хлеба")
        print("Дообавляем сверху ломтик " + lomtik)
        print("В качестве приправы добавляем " + self.dobavki)


buter_s_vetchinoi = gotovka()
buter_s_vetchinoi.buterbrod("ветчины")
 
  • Мне нравится
Реакции: pums

pums

Новичок
Пользователь
Авг 1, 2020
55
0
6
Благодарю за ответы. А сейчас как вызывать из класса функцию варки супа?
Python:
class gotovka:
    def __init__(self):
        self.dobavki = "перец, майонез"

    def buterbrod(self, lomtik):
        print("Берем ломтик хлеба")
        print("Добавляем сверху ломтик " + lomtik)
        print("В качестве приправы добавляем " + self.dobavki)

    def sup():
        print("варим из овощей вегетарианский суп")
        print("В качестве приправы добавляем " + self.dobavki)

buter_s_vetchinoi = gotovka()
buter_s_vetchinoi.buterbrod("ветчины")
sup = gotovka()
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 669
477
83
Python:
class Gotovka:
    def __init__(self):
        self.dobavki = "перец, майонез"

    def buterbrod(self, lomtik):
        print("Берем ломтик хлеба")
        print("Добавляем сверху ломтик " + lomtik)
        print("В качестве приправы добавляем " + self.dobavki)

    def sup(self):
        print("варим из овощей вегетарианский суп")
        print("В качестве приправы добавляем " + self.dobavki)

gotovka = Gotovka()
gotovka.buterbrod("ветчины")
gotovka.sup()
 
  • Мне нравится
Реакции: pums

pums

Новичок
Пользователь
Авг 1, 2020
55
0
6
Благодарю. Хотел ещё узнать про то, где я ошибся, написав self.lomtik. Возможно ли так писать для чего-либо, кроме обращения к __init__, отредактировав в каком то месте код?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 669
477
83
Благодарю. Хотел ещё узнать про то, где я ошибся, написав self.lomtik. Возможно ли так писать для чего-либо, кроме обращения к __init__, отредактировав в каком то месте код?
написав self.lomtik вы ссылаетесь на существующую переменную, например вы так делаете с self.dobavki, которую определили в конструкторе класса (в __init__)
можно написать так
Python:
class Gotovka:
    def __init__(self):
        self.dobavki = "перец, майонез"

    def other(self):
        self.lomtik = "ветчины"

    def buterbrod(self):
        print("Берем ломтик хлеба")
        print("Добавляем сверху ломтик " + self.lomtik)
        print("В качестве приправы добавляем " + self.dobavki)


    def sup(self):
        print("варим из овощей вегетарианский суп")
        print("В качестве приправы добавляем " + self.dobavki)


gotovka = Gotovka()
gotovka.other()
gotovka.buterbrod()
gotovka.sup()
здесь мы подставляем уже созданную переменную в методе other
то есть через self можно ссылаться на переменную, которая не обязательно создана в конструкторе (в __init__), но в аргументах писать переменную которая относится к классу нельзя (то есть с приставкой self)...

в вашем случае вы подставляете аргумент метода в вывод сообщения, аргумент называется lomtik, поэтому нужно писать lomtik, так как написано это в определении метода def buterbrod(self, lomtik):
можете почитать про классы в питон... и про что такое self...
возможно я плохо сформулировал...
 
Последнее редактирование:
  • Мне нравится
Реакции: pums

pums

Новичок
Пользователь
Авг 1, 2020
55
0
6
Благодарю. Прошу показать, как для функций бутерброда и супа добавить через декоратор:
Python:
print("Посолим по вкусу при необходимости")
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 669
477
83
Благодарю. Прошу показать, как для функций бутерброда и супа добавить через декоратор:
Python:
print("Посолим по вкусу при необходимости")
можно так например
Python:
def decorator(func):
    def func_decorator():
        func()
        print("Посолим по вкусу при необходимости")
    return func_decorator()


class Gotovka:
    def __init__(self):
        self.dobavki = "перец, майонез"

    def buterbrod(self, lomtik):
        print("Берем ломтик хлеба")
        print("Добавляем сверху ломтик " + lomtik)
        print("В качестве приправы добавляем " + self.dobavki)

    def sup(self):
        print("варим из овощей вегетарианский суп")
        print("В качестве приправы добавляем " + self.dobavki)

gotovka = Gotovka()

@decorator
def function1():
    gotovka.buterbrod("ветчины")

@decorator
def function2():
    gotovka.sup()
 
Последнее редактирование:
  • Мне нравится
Реакции: pums

pums

Новичок
Пользователь
Авг 1, 2020
55
0
6
Благодарю за информацию. С наступающим Новым Годом. Прошу подсказать, а как сейчас добавить с помощью декоратора фрагменты вначале вывода строк о последовательности приготовления пищи:
print('Моем руки')
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 669
477
83
вам нужно изменить принты в классе? или просто перед всеми принтами вывести "моем руки"? покажите пример строк которые вы хотите получить...
как я понял вопрос то можно так
Python:
def decorator(func):
    def func_decorator():
        print("Моем руки")
        func()
        print("Посолим по вкусу при необходимости")
    return func_decorator()
вас так же с наступающим
 

pums

Новичок
Пользователь
Авг 1, 2020
55
0
6
Благодарю. Да, именно это имел в виду. А как можно с помощью декоратора изменить какое-нибудь блюдо в меню? Например, чтобы вывод был таким.
Моем руки
Поджариваем хлеб в тостере. Добавляем сверху сыр.
В качестве приправы добавляем перец, майонез
Посолим по вкусу при необходимости
Моем руки
варим из овощей вегетарианский суп
В качестве приправы добавляем перец, майонез
Посолим по вкусу при необходимости
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 669
477
83
наверно так, сам текст вы не поменяете никак, вы можете передать переменную из декоратора, тем самым изменив вывод строк...
Python:
def decorator(func):
    def func_decorator(*args, **kwargs):
        print("Моем руки")
        func(*args, **kwargs)
        print("Посолим по вкусу при необходимости\n")
    return func_decorator


class Gotovka:
    def __init__(self):
        self.dobavki = "перец, майонез"

    def buterbrod(self, lomtik):
        print("Берем ломтик хлеба")
        print(lomtik)
        print("В качестве приправы добавляем " + self.dobavki)

    def sup(self):
        print("Варим из овощей вегетарианский суп")
        print("В качестве приправы добавляем " + self.dobavki)


gotovka = Gotovka()


@decorator
def function1(lomtik):
    gotovka.buterbrod(lomtik)


@decorator
def function2():
    gotovka.sup()


function1("Поджариваем хлеб в тостере. Добавляем сверху сыр.")
function2()
 
Последнее редактирование:
  • Мне нравится
Реакции: pums

Форум IT Специалистов