对装饰器函数的一次调用抑制了另一个
One call to decorator function suppressing the other one
来自以下代码
class User:
def __init__(self, name):
self.name = name
self.is_logged_in = False
def is_authenticated_decorator(function):
print('Decorator called')
def wrapper(*args, **kwargs):
user = args[0]
if user.is_logged_in:
function(user)
return wrapper
@is_authenticated_decorator
def create_blog_post(user):
print(f"This is {user.name}'s new blog post")
user_1 = User('John')
create_blog_post(user_1) # 1
user_1.is_logged_in = True
create_blog_post(user_1) # 2
我期望输出为
Decorator called
Decorator called
This is John's new blog post
相反,我得到的输出是
Decorator called
This is John's new blog post
当我注释掉标记为 #2 的语句时,我得到以下输出
Decorator called
为什么这个输出在 #2 存在的情况下被抑制?
is_authenticated_decorator
只在函数交给装饰器时调用一次。被多次调用的是wrapper
。要在每次调用函数时查看,print
应该在最终绑定到名称 create_blog_post
.
的 wrapper
中
来自以下代码
class User:
def __init__(self, name):
self.name = name
self.is_logged_in = False
def is_authenticated_decorator(function):
print('Decorator called')
def wrapper(*args, **kwargs):
user = args[0]
if user.is_logged_in:
function(user)
return wrapper
@is_authenticated_decorator
def create_blog_post(user):
print(f"This is {user.name}'s new blog post")
user_1 = User('John')
create_blog_post(user_1) # 1
user_1.is_logged_in = True
create_blog_post(user_1) # 2
我期望输出为
Decorator called
Decorator called
This is John's new blog post
相反,我得到的输出是
Decorator called
This is John's new blog post
当我注释掉标记为 #2 的语句时,我得到以下输出
Decorator called
为什么这个输出在 #2 存在的情况下被抑制?
is_authenticated_decorator
只在函数交给装饰器时调用一次。被多次调用的是wrapper
。要在每次调用函数时查看,print
应该在最终绑定到名称 create_blog_post
.
wrapper
中