У меня есть этот код:
class User:
def __init__(self, name):
self.name = name
self.is_logged_in = False
def is_authenticated_decorator(function):
def wrapper(*args, **kwargs):
if args[0].is_logged_in == True:
function(args[0])
return wrapper
@is_authenticated_decorator
def create_blog_post(user):
print(f"This is {user.name}'s new blog post.")
new_user = User("angela")
new_user.is_logged_in = True
create_blog_post(new_user)
Я не понимаю, как параметр create_blog_post(user)
извлекается из входных данных обертки.
Я понимаю, что
@is_authenticated_decorator
def create_blog_post(user):
Эквивалентно
create_blog_post = is_authenticated_decorator(create_blog_post)
Я понимаю, что create_blog_post
становится оберткой
Я понимаю, что create_blog_post(user)
звонит wrapper(user)
.
Я просто не понимаю, как?!
Может ли кто-нибудь объяснить маршрут/путь, по которому пользовательские параметры попадают в функцию-оболочку? спасибо ваш ответ будет высоко оценен.
Конечно:
Украшение сводится к create_blog_post = is_authenticated_decorator(create_blog_post)
Это означает, что мы вызываем тот декоратор, который возвращает wrapper
, но с определенной привязкой его параметра function
к нашему исходному create_blog_post
. Чтобы было проще, назовем оригинал create_blog_post
как original_create_blog_post
. Таким образом, оператор return
в is_authenticated_decorator
возвращает эту функцию:
def wrapper(*args, **kwargs):
if args[0].is_logged_in == True:
original_create_blog_post(args[0])
(function
заменено на orginal_create_blog_post
, поскольку это значение мы указали для параметра function
)
Присвоив это возвращаемое значение обратно create_blog_post
, мы, таким образом, определили его как:
def create_blog_post(*args, **kwargs):
if args[0].is_logged_in == True:
original_create_blog_post(args[0])
А если расширить определение того, что я называю original_create_blog_post
, то получим:
def create_blog_post(*args, **kwargs):
if args[0].is_logged_in == True:
print(f"This is {args[0].name}'s new blog post.")
Теперь, когда мы вызываем create_blog_post(user)
, переменная args[0]
равна user
.