如何真正的了解python装饰器
作者:FXL 发布时间:2023-03-16 09:08:23
合理使用装饰器可以简化开发,并且使得代码更加清晰。下面我们分别介绍两种装饰器,不带参数的装饰器和带参数的装饰器。
一、不带参数的装饰器
我们用一个实际的例子来引入装饰器的概念,比如我们现在有一个方法A(),然后我们需要在方法A()执行之前在终端打印"function is running",这时候我们可以在方法A()的开始部分加上下面的代码:
print("function is running")
但是如果我们不想修改方法A()的代码,也可以重新写一个方法decorator(),然后把A()作为入参,代码如下:
def decorator(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
print("Method is running")
return fun()
return wrapper
python中的方法可以作为参数传入另一个方法,所以当我们执行decorator(A)的时候,返回的是一个方法,这个方法的本质是先执行print语句,然后再执行A()。
但是这样我们的调用代码就需要进行修改,也就是说之前调用方法A(),现在的写法是调用decorator(A)(),为了不影响调用的代码,我们使用python的语法糖改造方法A()的代码。
@decorator
def A():
# do something
实际上只是在A()的前面加上一行@decorator,这样在我们的调用代码就不需要改变了。
装饰器中的@functools.wraps(fun)是为了保证返回的方法__name__属性和入参方法fun的__name__属性相同。
二、带入参的装饰器
在上面不带参数的装饰器中,我们实现了在执行方法A()之前打印一行固定的字符串,如果我们想要打印不同的字符串就需要用带参数的装饰器。实际上就是在不带参数的装饰器上再封装一层即可,代码如下:
def decorator_par(name):
def decorator(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
print("Method {} is running".format(name))
return fun()
return wrapper
return decorator
这样我们就可以在使用装饰器的时候设置参数name,实现打印不同的信息。完整的代码如下:
import functools
def decorator_par(name):
def decorator(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
print("Method {} is running".format(name))
return fun()
return wrapper
return decorator
@decorator_par("A")
def A():
print("I am A")
@decorator_par("B")
def B():
print("I am B")
A()
B()
执行输出为:
Method A is running
I am A
Method B is running
I am B
可以看到我们在不改变方法调用代码的情况下,实现了在该方法之前打印特定的信息。
内容扩展:
python函数式编程之装饰器
1.开放封闭原则
简单来说,就是对扩展开放,对修改封闭。
在面向对象的编程方式中,经常会定义各种函数。一个函数的使用分为定义阶段和使用阶段,一个函数定义完成以后,可能会在很多位置被调用。这意味着如果函数的定义阶段代码被修改,受到影响的地方就会有很多,此时很容易因为一个小地方的修改而影响整套系统的崩溃,所以对于现代程序开发行业来说,一套系统一旦上线,系统的源代码就一定不能够再改动了。然而一套系统上线以后,随着用户数量的不断增加,一定会为一套系统扩展添加新的功能。
此时,又不能修改原有系统的源代码,又要为原有系统开发增加新功能,这就是程序开发行业的开放封闭原则,这时就要用到装饰器了。
2.什么是装饰器
装饰器,顾名思义,就是装饰,修饰别的对象的一种工具。
所以装饰器可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象。
3.装饰器的作用
在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能。
来源:https://www.py.cn/toutiao/19855.html
猜你喜欢
- 学习使用存储过程(Stored Procedure),是ASP程序员的必须课之一。所有的大型数据库都支持存储过程,比如Oracle
- 本文实例讲述了Python实现合并同一个文件夹下所有txt文件的方法。分享给大家供大家参考,具体如下:一、需求分析合并一个文件夹下所有txt
- 方法一:同步操作1.pipelines.py文件(处理数据的python文件)import pymysqlclass LvyouPipeli
- django台后默认上传文件名在不使用分布式文件存储系统等第三方文件存储时,django使用默认的后台ImageField和FileFiel
- 一天不小心把ROOT的权限改到最小了(只能登录,什么都做不了),这可急死我了.重装的话太麻烦,而且里面有很多的用户,一个个重新弄不知道到什么
- 0. 前言本节中,我们使用策略梯度算法解决 CartPole 问题。虽然在这个简单问题中,使用随机搜索策略和爬山算法就足
- ASP中转换unicode编码为GB编码方法:<% function urldecode(encodestr)
- tensorflow在保存权重模型时多使用tf.train.Saver().save 函数进行权重保存,保存的ckpt文件无法直接打开,不利
- 今天搭了个“发短信”的页面,找朋友测试,没想到一位大侠直接弄了本长篇小说发我手机上……为了我的宝贝手机能继续健康澎湃,给文本区域(texta
- 什么情况下用响应缓冲会提高运行速度?例1、脚本引擎与 HTML 之间的切换频繁,对响应流写操作太多,导致性能下降:<table>
- 本文实例讲述了Python字符串、列表、元组、字典、集合。分享给大家供大家参考,具体如下:附加:python的很多编译器提供了代码补全功能,
- 题目描述724. 寻找数组的中心下标 - 力扣(LeetCode) (leetcode-cn.com)给你一个整数数组 nums
- 前言都说抖音有毒,一刷就停不下来了。看来抖音这款产品紧紧抓住了人们内心深处的某些需求。当然今天不是来探讨抖音这款产品的啊。今天我们来学习如何
- mitmproxy是一个支持HTTP和HTTPS的抓包程序,类似Fiddler、Charles的功能,只不过它通过控制台的形式操作。此外,m
- 有很多种方法来实现图片的预加载,通常大部分使用Javascript让事情滚动。不要再受Javascript预载的束缚了吧,用CSS你就可以毫
- 推荐的国内镜像站[ 个人推荐清华大学pypi镜像站(https://mirrors.tuna.tsinghua.edu.cn/help/py
- 一. 网页挂马的概念: 网页挂马是指:在获取网站或者网站服务器的部分或者全部权限后,在网
- 用Python求解微分线性方程因为之前用matlab也编写过,所以前不久试着用python写,感觉之间互通点也蛮多的,易理解。题目:稀疏线性
- 解包在英文里叫做 Unpacking,就是将容器里面的元素逐个取出来放在其它地方,好比你父母去菜市场买了一袋苹果回来分别发给家里的每个成员,
- 这篇文章主要介绍了python主线程与子线程的结束顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,