Как определить декоратора в классе?

#python #python-3.x #decorator #python-decorators

Вопрос:

Я хотел использовать декоратор внутри класса, но я получаю позиционную ошибку. 1.Я не хочу использовать функции и импортировать обертки. 2.Можем ли мы объявить его внутри класса, а не определять декоратора вне класса? Существует ли какой-либо другой метод для объявления декоратора в классе?

 from pytube import YouTube

if __name__ == "__main__":
    class term :
        # def __init__(self,u,v):
        #     self.url = u
        #     self.path = v

        def check(func):
            def parameters(self,u,v):
                print(f"title:{YouTube(u).title}, views:{YouTube(u).views}, Length:{YouTube(u).length}")
                func(u,v)
                print("Yes done")
            return parameters
        # return check

        @check
        def video1(self,u,v):
            # y = YouTube(u)
            # print("Y is",y) 
            video1 = YouTube(u).streams.first().download(v)
            print("Success") 
            return video1

u = input("Enter the video URL: ")
v = input("Enter the path: ")

t1 = term()
t1.video1(u,v)
print(t1)
 

Если я инициализирую u,v внутри класса и вызываю его через t1 и использую его в таких методах, как проверка, это выдает ошибку, в которой говорится, что термин имеет ошибку позиционного аргумента.

Если я инициализирую u,v внутри экземпляра t1 и вызову его через t1.video1 и использую его в таких методах, как проверка, это выдаст ошибку, в которой говорится, что у видео нет позиционного аргумента «v».

Как использовать декораторы?Не могли бы вы, пожалуйста, помочь мне.

Комментарии:

1. Пожалуйста, добавьте обратную запись ошибок, с которыми вы сталкиваетесь.

2. Вам нужно передать self такой метод, как func(self, u,v) .

Ответ №1:

Вот только пример для вас, (измените в соответствии с вашими потребностями) —

 class term:

    def check(func):
        def parameters(self, u, v):
            print(f"title:")
            print("Yes done")
            return func(self, u, v)
        return parameters

    @check
    def video1(self, u, v):
        print("Success")
        return 'Hello'
 

Кроме того, вы печатаете такой объект, как

 t1 = term()
t1.video1(u,v)
print(t1)
 

Но, вы должны печатать, как —

 t1 = term()
result = t1.video1(u,v)
print(result)
 

Комментарии:

1. почему я должен снова создавать объект для t1 ? @Suyog Shimpi

2. Если вы хотите где-то сохранить значение, вот почему я сохранил его в переменной result = t1.video1(u,v) . В противном случае вы также можете использовать print(t1.video1(u,v))