ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

通俗地讲解Python的装饰器

通俗地讲解Python的装饰器 1. 装饰器的概念类比所谓的装饰器, 其实就是一种概念上的比喻说法。这种说法认为。给函数这个对象。穿上了一件。额外的外衣。我们来做一个假设。想象你手头有一个函数存在。它就像一个自然人一样。这个人具备完成特定任务的能力。举个例子来说。这个人可以执行计算两个数值之和的操作。那么。装饰器到底是干什么的。它的作用就像是给上述提到的人。强行添加一些辅助性的功能出来。比如在正式执行加法运算之前。先对传入的参数进行合规性筛查。另外。也可能在运算结束以后。顺手把所用时间记录下来。从另一个角度来讲, 那个装饰器呀, 它是跟手机上的那个保护壳差不多的一个东西, 手机本身, 它就是一个函数, 它有那些基本的功能存在, 比如说打电话和发短信这些东西都是它的功能, 那个保护壳作为装饰器, 它可以给这部手机增加一些其他的新功能的, 像是防水啊防摔啊这种新功能的存在是不去改变手机本身所具备的那些打电话以及发短信的基本的功能的, 不过它确实是可以增强手机的那个整体的性能的。2. 简单的装饰器示例代码解释首先, 我们要去看一下一个最基础的用来做装饰的结构是个什么样子的。pythondef decorator_function(func):def wrapper():print(在函数执行前做一些事情)func()print(在函数执行后做一些事情)return wrapper在这里我们定义了一个名为空的函数, 这个函数的名字是空白的, 它接收到了一个叫做func的作为参数, 并且把这个叫func的当作是这个函数自己的参数来处理, 而这个名称为空白的这个函数部分呢, 我们就把它给称为是我们的那个装饰器。然后在装饰器里面定义了一个新函数, 这个新函数就像是为原来的那个 func 函数穿上了一件衣服。当调用那个被修饰的函数的时候, 程序会先执行打印出在函数执行前做一些事情的这句代码, 这个操作就是代表着向原本函数的流程里面添加了一个前置的动作或者说是额外加的功能, 紧接着再去运行func()这个原来的核心逻辑, 等到里面的主体部分都处理完了, 最后再去执行打印出在函数执行后做一些事情的这一句代码, 这步就是在说原来函数跑完之后还要加上一个后置的处理环节, 整个这一套流程就这么按顺序地给过了一遍, 先事前准备, 再处理核心事情, 最后是事后收尾。等到最后, 装饰器返回函数这个对象。我们假设一下, 我们这里存在一个函数, 这个函数的复杂度是比较简单的。pythondef say_hello():print(Hello!)关于如何使用装饰器来对这个函数进行装饰操作, 我们可以采取下面的这一种做法方式来完成任务。pythondecorated_say_hello decorator_function(say_hello)decorated_say_hello()首先第一步是把这个函数传递给装饰器。然后返回的那个函数会被赋值给。最后再去调用()。这么一调用就会执行函数。这就实现了在函数执行之前和执行之后去添加一些额外的功能。3. 语法糖形式的装饰器解释在实际使用的过程中, 还有一种更为简洁的方式可以来使用装饰器, 这种方式我们给它取了一个名字, 叫作语法糖。依据上面所展示的代码内容, 我们可以对其进行如下的改写操作:pythondecorator_functiondef say_hello():print(Hello!)这种使用了符号的写法, 其意义其实就是等同于 ()这样的形式。它可以让代码看上去更加简洁一些。同时, 它也更符合现在大家习惯了的编程方式。4. 装饰器的实际用途举例日志记录假设说你现在有一个函数, 这个函数是用来处理用户的订单情况的, 你想要把这每一次去调用这个函数的具体时间记录下来, 并且还想把这个函数里面的参数信息等东西也都保存下来。pythonimport timedef log_decorator(func):def wrapper(*args, kwargs):start_time time.time()print(f开始调用函数 {func.__name__}参数为{args}和{kwargs})result func(*args, kwargs)end_time time.time()print(f函数 {func.__name__} 执行完成耗时{(end_time start_time)}秒)return resultreturn wrapperlog_decoratordef process_order(order_id, product_name):print(f正在处理订单 {order_id}产品为{product_name})# 模拟订单处理时间time.sleep(2)return 订单处理成功在这里, 装饰器这个东西是可以用来记录函数在调用的时候所花费的时间以及所使用的参数等等相关信息的。并且, 当去调用特定的这个函数的时候, 就会自动地去把装饰器里面已经写好的那些代码给执行起来。这样做呢, 就是在函数正式被执行之前和之后这两个阶段里, 额外地加上一些专门用于记录日志的功能操作。权限验证如果你手头有一个用于获取用户敏感信息的网页应用后端函数, 那么你可能就需要去验证这个用户到底有没有权限进行访问。pythondef permission_check_decorator(func):def wrapper(user):if user.has_permission():return func(user)else:print(用户没有权限访问此功能)return wrapperclass User:def __init__(self, has_permission):self.has_permission has_permissionpermission_check_decoratordef get_user_info(user):print(获取用户信息)return 用户的详细信息在这个例子中装饰器会检查用户对象user是否有访问权限这一点是现在人们能直接看懂的普通话书面语, 如果有这个权限的话就执行相关函数来获取用户信息, 如果没有这个权限的话就打印提示信息, 这样操作的目的就是为了通过装饰器这一手段方便地给函数添加权限验证的功能, 每个词都要是现在常用的, 长句被切断成了逗号分句。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表