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