简单上手Python中装饰器的使用
作者:Yi_Zhi_Yu 发布时间:2023-06-20 19:20:06
Python的装饰器可以实现在代码运行期间修改函数的上下文, 即可以定义函数在执行之前进行何种操作和函数执行后进行何种操作, 而函数本身并没有任何的改变。
这个看起来很复杂, 实际上应用到了我之前说过的闭包的概念, 仔细看一看, 其实并不复杂。
首先, 我们先定义一个函数, 这个函数可以输出我的个人昵称:
def my_name():
print "Yi_Zhi_Yu"
my_name() # Yi_Zhi_Yu
那假如我需要在个人昵称输出前, 在输出我的个人uid呢, 当然, 要求是不改动现有的my_name函数, 这个时候就可以使用装饰器了
首先, 装饰器也是个函数, 其次, 他需要接受一个参数,该参数表示了要被装饰的函数(即my_name):
def my_info(func):
def wrapper(*args, **params):
print 218
return func(*args, **params)
return wrapper
然后与相应的被装饰函数关联起来的方法就是使用@my_info写在被装饰函数的前面
@my_info
def my_name():
print "Yi_Zhi_Yu"
最后, 在执行my_name的时候, 就能既输出我的uid, 又能输出我的昵称了
my_name()
#218
#Yi_Zhi_Yu
在上面, 最让我们疑惑的是装饰器函数定义里面的wrapper函数, 装饰器本身返回的是wrapper函数的定义, 而wrapper中则定义了对被装饰函数(my_name)的调用, func表示的就是被装饰函数, 说白了, 装饰器只是把某个不得改动的函数(a)放到另一个函数(b)中, 在b里面调用a, 在调用前后就可以做所谓的看起来像装饰的工作了。
my_info的最终返回的wrapper函数的定义, 并不是执行结果,只有当wrapper真正执行的时候, 才会真正的执行my_name方法, 这就是闭包时所说的内容。
wrapper中的参数, 实际上则是传递给func(实际上是my_name)的参数
因为装饰器也是个函数, 那么装饰器自己的能不能有参数传递呢。可以, 不过需要定义一个更高阶的函数, 也就是外面还要套一层函数, 比如, 我还要输出我的自定义的一个信息,需要传递参数
def c_info(text):
def my_info(func):
def wrapper(*args, **params):
print text
print 218
return func(*args, **params)
return wrapper
return my_info
#使用装饰器
@c_info("Tony")
def my_name():
print "Yi_Zhi_Yu"
my_name()
#Tony
#218
#Yi_Zhi_Yu
与前面的那个装饰器相比, 仅仅是多了个外层, 内层也仅仅是增加了对外层传入参数(text)的调用
总而言之, Python在函数定义中支持了对oop思想中的装饰器的实现, 其本质也只是使用了闭包的思路, 延迟调用, 并在调用前后增加自己的其他实现内容


猜你喜欢
- 一、Hive介绍hive: 由 Facebook 开源用于解决海量结构化日志的数据统计工具。Hive 是基于 Hadoop 的一个数据仓库工
- 普通爬虫正常流程:数据来源分析发送请求获取数据解析数据保存数据环境介绍python 3.8pycharm 2021专业版【付费VIP完整版】
- 我们的网络协议一般是把数据转换成JSON之后再传输。之前在Java里面,实现序列化和反序列化,不管是 jackson ,还是 fastjso
- 遇到mysql ERROR 1045 这个问题搞了很久,自己记下来。方法是百度的,亲测有效。ERROR 1045 (28000): Acce
- 一.Memory Dumps 1).Global Area ALTER SESSION SET EVENTS ‘immediate trac
- 1303-Can 't create a PROCEDURE from within another stored routine.
- <% Rem Rem ## 在线升级类声明 Class Cls_oUpdate
- 前言这篇文章主要介绍了使用Python画了一棵圣诞树的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价
- 需求是小程序做头部做导航分类的效果顶部用 scroll-view 组件横向滚动,类似tab选项卡的效果,内容用类似模板方式引用,可重复利用&
- 操作步骤导入框架,import unitest测试类必须继承类:.class 类名(unittest.TestCase):在类中所有定义te
- PyQt5单选按钮控件QRadioButton简介QRadioButton 继承自 QAbstractButton,其主要作用提供用户一些互
- 在画一些曲线图(linecharts)时,常常会出现多条曲线同时画在一张图上面,这时候就需要对不同的曲线进行不同的标注,以使读者能够清晰地知
- 假如一个页面中的文本采用的都是同样的字体、同样的字号、同样的颜色,做为读者的你能轻易的区分出哪里是标题,哪里是正文内容吗?所以通常情况下,设
- 前言最近在工作中遇到了这个需求,估计搞了一个多小时才把这个远程连接搞好。一台本地电脑,一台云服务器,都是linux系统。下面来看看详细的介绍
- 版本号:Python2.7.5,Python3改动较大,各位另寻教程。所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存
- 在计算机科学中,精确的小数计算是一个常见的问题,因为在计算机中使用二进制表示小数时,有些小数可能无法用二进制表示精确的十进制数。这导致了在计
- 本文实例为大家分享了微信小程序实现底部导航带跳转功能的具体代码,供大家参考,具体内容如下index.wxml<!--底部导航 --&g
- 前言本文主要给大家介绍了关于Python3用SMTP协议发送电子邮件的相关内容,在介绍如何使用python程序向指定邮箱发送邮件之前,我们需
- 推荐系统中经常需要处理类似user_id, item_id, rating这样的数据,其实就是数学里面的稀疏矩阵,scipy中提供了spar
- 使用模块requests方式代码如下:import requests url_string="https://******&quo