我有这个密码:

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)

这意味着我们调用decorator,它返回wrapper,但它的function参数与最初的create_blog_post参数有一个特定的绑定.为了方便起见,我们把原来的create_blog_post称为original_create_blog_post.is_authenticated_decorator中的return语句返回这个函数:

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.

Python相关问答推荐

错误:找不到TensorFlow / Cygwin的匹配分布

有没有方法可以关闭Python多处理资源跟踪器进程?

Pandas 密集排名具有相同值,按顺序排列

在Docker中运行HAProxy时无法获得503服务

合并同名列,但一列为空,另一列包含值

如何处理必须存在于环境中但无法安装的Python项目依赖项?

如何匹配3D圆柱体的轴和半径?

如何修复使用turtle和tkinter制作的绘画应用程序的撤销功能

Google Drive API获取文件计量数据

根据给定日期的状态过滤查询集

@Property方法上的inspect.getmembers出现意外行为,引发异常

Pandas 在最近的日期合并,考虑到破产

如何在箱形图中添加绘制线的传奇?

Django mysql图标不适用于小 case

根据二元组列表在pandas中创建新列

如何使用数组的最小条目拆分数组

Odoo 16使用NTFS使字段只读

删除marplotlib条形图上的底边

Python逻辑操作作为Pandas中的条件

在matplotlib中使用不同大小的标记顶部添加批注