python无参数装饰器_python_之无参装饰器_01
# 1:提问:什么是装饰器?
# 解答:根据字面意思可以理解,装饰器就是用来装饰函数的工具。
#
# 2:装饰器有什么特点?
# 解答:(1) 装饰器原则:开放封闭原则。 解释==》开放是指,对外开放,封闭是指:不修改原代码。
# (2) 特点1:给被装饰函数添加新功能
# (3) 特点2: 调用被装饰函数
#
# 3:小案例: 给index()函数加上计时器
# import time
# def index(name):
# print(f"欢迎{name}来到这里")
# return "我是index的返回值"
#
# def home(name):
# print(f"欢迎{name}回家了")
# (1) 不改变源代码,不改变调用方式
# start_time = time.time()
# index("madison")
# sto_time = time.time()
# 问题1==》如果项目中有很多地方调用的话,会出现代码冗余的问题。==》优化方案如下:封装它
# 这样一来,我们就解决了代码冗余问题:
# def wrapper():
# start_time = time.time()
# index("madison")
# stop_time = time.time()
# 问题2:虽说解决了代码冗余问题,但是我们这里index()的参数写死了,
# 并且这个装饰器里面的调用的函数写死了
# 只能调用index(),如果还有一个功能home()怎么办?
# 优化方案如下 ==》
# (1):解决传参问题 ==》 利用(*args, **keargs) 进行传参和解包
# (2):解决index()函数写死问题,利用闭包传参
# import time
# def outter(func):
# def wrapper(*args, **kwargs):
# start_time = time.time()
# func(*args, **kwargs) # 对传进来的参数进行解包!
# stop_time = time.time()
# return wrapper # 返回wrapper的内存地址
#
# wrapper = outter(index)
# wrapper("madison")
# print("====================")
# wrapper = outter(home) # 在试试调用home上面忘记试了,看好不好使
# wrapper("madison")
# 这里我解释下:return wrapper是因为,wrapper之前是全局变量,现在被我们写成局部变量了,
# 所以在这里
# 我们需要把它变回去,所以我们就返回它的内存地址,
# 上面我们调用outter(index)就是得到的wrapper的内存
# 地址,这里赋值给wrapper所以此时 wrapper又变回成了全局变量然后传参调用wrapper即可!
# 问题3:上面我们已经解决了写死函数和传参问题,那么还有个问题就是返回值的问题?
# 假如index有返回值,怎么办?
# import time
# def outter(func):
# def wrapper(*args, **kwargs):
# start_time = time.time()
# res = func(*args, **kwargs) # 对传进来的参数进行解包!
# stop_time = time.time()
# return res
# return wrapper # 返回wrapper的内存地址
#
# wrapper = outter(index)
# print(wrapper("madison"))
# 优化方式:看上面,我们知道index的返回值这个装饰器内部,它是func=index,所以index返回啥,我们func就返回
# 啥就可以了,所以就有了上面的 return res,对了你可以试试在wrapper内部不接收打印,结果会是None,原因是因为
# 我们现在调用的其实是wrapper,而不是index,有的小伙伴可能会蒙蔽,我上面明明就是调用的wrapper....这个问题
# 你要回去了解下闭包原理了(这里第二种传参是闭包原理,不理解最好看一边后在看上面的列子)。其实这里我们可以把
# wrapper = outter(index)改成 index = outter(index),你看,这样我们是不是就 没有修改源码和调用方式
# 问题4:上面我们已经做到,不修改源码和调用方式,就做了一个装饰功能,但是还有问题,我们每次调用的时候都要去定义
# wrapper = outter(index)/# wrapper = outter(home),我们需要优化下,方法是:@(语法糖的意思,甜甜
# 的嘿嘿。)
import time
def outter(func):
def wrapper(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs) # 对传进来的参数进行解包!
stop_time = time.time()
return res
return wrapper # 返回wrapper的内存地址
# index = outter(index)
# print(index("madison"))
# 问题4的优化方案:在我们需要调用装饰器的头上写上 @outter 即可
@outter
def index(name):
print(f"欢迎{name}来到这里")
return "我是index的返回值"
@outter # 它在这做了下面几件事
# 1:调用outter ==> outter()
# 2: 将被装饰(index)传进去 ==》 outter(index)
# 3: 赋值给变量,变量名被装饰自己 ==》 index = outter(index)
def home(name):
print(f"欢迎{name}回家了")
最后附上本节的完整代码的图片
python无参数装饰器_python_之无参装饰器_01相关推荐
- 装饰器,语法糖.有参装饰器 ,无参装饰器
装饰器 什么是装饰器 一种为其他函数增加新功能的函数就是装饰器 装饰器基于闭包函数实现 器,指的就是一种工具,例如生活中,打孔器 装饰,指的是给某个已存在的对象添加装饰品 装饰的目的是为了给这个被装饰 ...
- python教程:有参装饰器
由于语法糖@的限制,outter函数只能有一个参数,并且该才是只用来接收被装饰对象的内存地址 def outter(func):def wrapper(*args,**kwargs):res=func ...
- 《R语言数据挖掘:实用项目解析》——第2章,第2.9节无参数方法
本节书摘来自华章出版社<R语言数据挖掘:实用项目解析>一书中的第2章,第2.9节无参数方法,作者[印度]普拉迪帕塔·米什拉(Pradeepta Mishra),更多章节内容可以访问云栖社区 ...
- python关键字参数可以避免什么问题_python入门课|Python关键字参数使用方法公布,能解决80%的python函数问题...
[摘要]在这个科学技术高速发展的时代,越来越多的人都开始选择学习编程软件,那么首先被大家选择的编程软件就是python,也用在各行各业之中,并被大家所熟知,所以也有越来越多的python学习者关注py ...
- python无参数装饰器_Python装饰器(不带参数)
示例 直接给出示例,普通装饰器(即装饰器函数本身不带参数,或参数为实际被包裹的函数): import time from functools import wraps def timethis(fun ...
- python中的无参装饰器和有参装饰器
python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器 ...
- 在Python中的无参装饰器和有参装饰器
装饰器特点: 1.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2.装饰器本质可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象: 3.装饰器的功能是在不修改被装饰器对象源代码以及被装饰器 ...
- Python+Opencv实现无参数、全自动的Canny算法
目录 一.什么是Canny边缘检测算法? 二.最优边缘准则是什么? 三.Canny算法实现步骤 四.Canny算法在使用中的问题? 五.无参数.自动化Canny算法代码实现 六.改进算法效果展示 七. ...
- python带参数装饰器 函数名_python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)...
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
最新文章
- 简单介绍Windows中将Nginx添加为服务的问题
- springCloud--1
- 前端一HTML:十九继承的特殊性
- c#只读字段和常量的区别,以及静态构造函数的使用 .
- 不拦截指定路径_控制层访问拦截
- C#弹窗提示并自动关闭方法
- Science | 再创生命奇迹!日本科学家造出了不需要“父亲”的大鼠及小鼠
- 计算机WIN7动态硬盘分区,win7硬盘分区教程
- 美国只有两样东西比中国贵
- 【数论Day1】 最大公约数(gcd)题目
- win11开机动画关闭教程
- 前端播放m3u8格式视频
- FAT 32 文件系统学习
- 区块链概念及简单介绍
- STARK Low Degree Testing——FRI
- html5新特性的理解
- 从零开始的Android:Android应用程序开发概述
- 仙童半导体和“八叛逆”所缔造的硅谷模式
- 【ML】评估一个分类器:精确率和召回率(Evaluation of Classifier)
- 不装软件查看Mac的CPU温度、风扇转速等信息
热门文章
- Java 对象和类的一些笔记总结
- easyui combobox开启搜索自动完成功能
- 分布式服务框架dubbo原理解析 转
- C#怎么遍历一个对象里面的全部属性?
- PHP的composer清除缓存
- PHP字符串替换函数选择
- 转盘抽奖(主要:概率和JQ)
- 华为8lite支持云闪付吗_鸿蒙系统适配机型表曝光,部分华为旗舰机未支持,你是其中之一吗...
- PHP中利用header设置content-type和常见文件类型的content-type
- python3.6.2下载教程_Windows下升级Python3.7.7后(原Python3.6.2版本)如何切换Python版本|python基础教程|python入门|python教程...