谁会拒绝一篇关于【python装饰器】的友情分享呢~
Python 关于 分享 一篇 装饰 拒绝
2023-09-11 14:15:56 时间
一、什么是装饰器
- python装饰器是用于拓展原来函数功能的一种函数,目的是在不改变原函数的情况下,给函数增加功能。
- 装饰器是通过闭包实现,所以讲装饰器首先得知道什么是闭包。
二、什么是闭包
一、什么是闭包
- 一个定义在函数内部的函数,闭包可以让变量脱离了该函数的作用域也依然能被访问到
- 定义一个嵌套函数,内函数内部使用外函数变量,让外函数将内函数当做参数返回,这样就组成了一个闭包
二、举个例子
def outer(x):
def inner():
y = x * 2
return y
return inner
result=outer(10)
print(result())
三、执行过程分析
- 调用外函数(outer),将参数赋值给x,此时x=10
- 执行外函数(outer),内函数(inner)不会被执行
- 执行到return语句此时返回内函数inner对象(不会被调用)
- 此时外函数(outer)执行结束的时候发现内部函数会用到自己的临时变量
- 此时外函数(outer)临时变量就不会释放,会绑定给内函数内函数(inner)继续使用
- 此时result得到的结果就是inner引用(对象),调用result就等于执行内函数(inner)
三、函数装饰器
一、原理
- 闭包的特性
- 函数可以被当做参数传递
二、举个例子
import time
def outer(fn):
def inner(x,y):
start_time = time.time()
result = fn(x,y)
end_time = time.time()
return result,end_time - start_time
print('第一次',inner)
return inner
@outer
def test01(x,y):
time.sleep(5)
return x+y
print('第二次',test01)
result=test01(1,2)
print(result)
三、执行过程分析
第一步:执行到@outer相当于把函数 test01 赋值给 outer函数的fn参数
第二步:执行outer函数,返回inner函数
1、outer函数内部嵌套了一个inner函数,利用闭包的原理inner函数可以直接使用outer函数fn的参数
2、在执行outer函数的时候,inner函数并未被执行,是直接返回inner函数给test01函数
3、此时的test01函数已经被outer增加功能后返回的inner函数替换掉了(第一次,第二次打印结果就是证据)
第三步:执行test01(1,2),此时相当于执行inner(1,2)函数参数直接传递给inner函数的x,y
内存地址变化
- outer内存地址:
<function outer at 0x102e051e0>
- test01内存地址:
<function test01 at 0x103739158>
- inner内存地址:
<function outer.<locals>.inner at 0x103739268>
- test01内存地址:
<function outer.<locals>.inner at 0x103739268>
四、类装饰器
一、原理
- 通过重写call方法实现
二、写法
import time
class Decrator:
def __init__(self,fn):
self.fn = fn
def __call__(self, *args, **kwargs):
start_time = time.time()
result = self.fn(*args, **kwargs)
end_time = time.time()
west_time = end_time - start_time
return result,west_time
@Decrator
def sum(x,y):
print(sum)
return x+y
sum(1,2)
三、执行过程分析
-
call()方法的作用其实是把一个类的实例化对象变成了可调用对象,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。
-
当调用sum函数的时候,会先将sum函数作为参数传给Decrator类(通过类的
__init__
初始化函数接收),此时 fn =sum(x,y)(只是实例未调用) -
此时sum函数传递进来的参数为元组,就会赋值给了
__call__
方法,args -
此时sum函数传递进来的参数为字典,就赋值给了
__call__
方法,kwargs -
在
__call__
方法中做一系列操作之后,return self.fn(*args) 再传递给sum函数 * -
*
__call__
方法返回的函数self.fn(*args是被装饰后的函数实例,然后传给sum函数执行 -
__call__
必须要return装饰后的函数,否则会报错
相关文章
- Python脚本扫描给定网段的MAC地址表(scapy或 python-nmap)
- python语法基础_01.Python基础
- 关于Python自动化的就业真相
- python sdk是什么_SDK 和 API 的区别是什么?
- python是否存在某个字符串 效率最高_Python中判断子串存在的性能比较及分析总结...
- python相关系数
- Python自动化测试:pytest实现关键字驱动
- Python re模块中match和search的区别
- 【零基础学python】:清华官方出品的《看漫画学Python》全彩PDF,495页资源分享
- 24岁非计算机专业工科妹子裸辞转行Python程序员,自学Python三个月,零基础如何系统学习python,从入门到精通?
- 如何高效自学python?
- python random随机生成详解
- 《python 与数据挖掘 》一1.3 Python开发环境的搭建
- python合并pdf
- 执行python安装命令时报错"ModuleNotFoundError: No module named 'setuptools'"如何处理?
- Python基础知识小结
- Python网络爬虫 - 一个简单的爬虫例子
- 《树莓派Python编程入门与实战》——3.5 关于Python交互式shell
- 《Python 3程序开发指南(第2版•修订版)》——2.4 字符串
- 《趣学Python——教孩子学编程》——第1部分 学习编程 第1章 Python不是大蟒蛇 1.1 关于计算机语言
- 关于《Python自动化测试实战》
- 【Python 八股文】- Redis基础
- Python 基础 之 Ubuntu 上安装 python 和 python-pip
- Python 基础 之 python 线程知识点整理,并实现一个简单多线程 udp 聊天应用
- Python 工具 之 Windows 上 python 虚拟环境的搭建与简单使用的相关说明
- python六十一课——高阶函数之reduce
- Python之关于量化投资实现代码--根据策略提出的代码--还未完善
- 关于Python ord()和chr()返回ASCII码和Unicode码的看法
- 【python】dict多种方法实现去除字典value为0 的元素
- python界面Tkinter编程(基础)