# 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相关推荐

  1. 装饰器,语法糖.有参装饰器 ,无参装饰器

    装饰器 什么是装饰器 一种为其他函数增加新功能的函数就是装饰器 装饰器基于闭包函数实现 器,指的就是一种工具,例如生活中,打孔器 装饰,指的是给某个已存在的对象添加装饰品 装饰的目的是为了给这个被装饰 ...

  2. python教程:有参装饰器

    由于语法糖@的限制,outter函数只能有一个参数,并且该才是只用来接收被装饰对象的内存地址 def outter(func):def wrapper(*args,**kwargs):res=func ...

  3. 《R语言数据挖掘:实用项目解析》——第2章,第2.9节无参数方法

    本节书摘来自华章出版社<R语言数据挖掘:实用项目解析>一书中的第2章,第2.9节无参数方法,作者[印度]普拉迪帕塔·米什拉(Pradeepta Mishra),更多章节内容可以访问云栖社区 ...

  4. python关键字参数可以避免什么问题_python入门课|Python关键字参数使用方法公布,能解决80%的python函数问题...

    [摘要]在这个科学技术高速发展的时代,越来越多的人都开始选择学习编程软件,那么首先被大家选择的编程软件就是python,也用在各行各业之中,并被大家所熟知,所以也有越来越多的python学习者关注py ...

  5. python无参数装饰器_Python装饰器(不带参数)

    示例 直接给出示例,普通装饰器(即装饰器函数本身不带参数,或参数为实际被包裹的函数): import time from functools import wraps def timethis(fun ...

  6. python中的无参装饰器和有参装饰器

    python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器 ...

  7. 在Python中的无参装饰器和有参装饰器

    装饰器特点: 1.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2.装饰器本质可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象: 3.装饰器的功能是在不修改被装饰器对象源代码以及被装饰器 ...

  8. Python+Opencv实现无参数、全自动的Canny算法

    目录 一.什么是Canny边缘检测算法? 二.最优边缘准则是什么? 三.Canny算法实现步骤 四.Canny算法在使用中的问题? 五.无参数.自动化Canny算法代码实现 六.改进算法效果展示 七. ...

  9. python带参数装饰器 函数名_python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)...

    一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...

最新文章

  1. 简单介绍Windows中将Nginx添加为服务的问题
  2. springCloud--1
  3. 前端一HTML:十九继承的特殊性
  4. c#只读字段和常量的区别,以及静态构造函数的使用 .
  5. 不拦截指定路径_控制层访问拦截
  6. C#弹窗提示并自动关闭方法
  7. Science | 再创生命奇迹!日本科学家造出了不需要“父亲”的大鼠及小鼠
  8. 计算机WIN7动态硬盘分区,win7硬盘分区教程
  9. 美国只有两样东西比中国贵
  10. 【数论Day1】 最大公约数(gcd)题目
  11. win11开机动画关闭教程
  12. 前端播放m3u8格式视频
  13. FAT 32 文件系统学习
  14. 区块链概念及简单介绍
  15. STARK Low Degree Testing——FRI
  16. html5新特性的理解
  17. 从零开始的Android:Android应用程序开发概述
  18. 仙童半导体和“八叛逆”所缔造的硅谷模式
  19. 【ML】评估一个分类器:精确率和召回率(Evaluation of Classifier)
  20. 不装软件查看Mac的CPU温度、风扇转速等信息

热门文章

  1. Java 对象和类的一些笔记总结
  2. easyui combobox开启搜索自动完成功能
  3. 分布式服务框架dubbo原理解析 转
  4. C#怎么遍历一个对象里面的全部属性?
  5. PHP的composer清除缓存
  6. PHP字符串替换函数选择
  7. 转盘抽奖(主要:概率和JQ)
  8. 华为8lite支持云闪付吗_鸿蒙系统适配机型表曝光,部分华为旗舰机未支持,你是其中之一吗...
  9. PHP中利用header设置content-type和常见文件类型的content-type
  10. python3.6.2下载教程_Windows下升级Python3.7.7后(原Python3.6.2版本)如何切换Python版本|python基础教程|python入门|python教程...