python 装饰器-初识
一、装饰器的形成过程
1.函数无参数,无返回值
import time def f1(): # 无参数,无返回值
time.sleep(1)
print("Hello, World!") def timer(f): # f 是函数名
def inner(): # 闭包
start = time.time()
f()
end = time.time()
total = end - start
print(total)
return inner f1 = timer(f1) # 调用timer()函数,获取inner函数名指向的内存地址的返回值
f1()
2.函数有返回值,无参数
import time def f1(): # 无参数,有返回值
time.sleep(1)
print("Hello, World!")
return True def timer(f): # f 是函数名
def inner(): # 闭包
start = time.time()
ret = f()
end = time.time()
total = end - start
print(total)
return ret
return inner f1 = timer(f1) # 调用timer()函数,获取inner函数名指向的内存地址的返回值
ret = f1()
print(ret)
3.函数有参数,有返回值
def f1(a, **kwargs): # 参数,返回值 *args和**args可以组成任意类型的参数
time.sleep(1)
print("Hello, World!", a, kwargs)
return "abc" def timer(f): # f 是函数名
def inner(*args, **kwargs): # 闭包
start = time.time()
ret = f(*args, **kwargs)
end = time.time()
total = end - start
print(total)
return ret
return inner f1 = timer(f1) # 调用timer()函数,获取inner函数名指向的内存地址的返回值
ret = f1(1, name='tom')
print(ret)
二、装饰器的作用
在不改变函数调用方式的情况下,在原函数的前后添加功能
三、开放封闭原则
开放:对扩展开放
封闭:对修改封闭
这是装饰器开发的原则
四、语法糖
简化代码
import time def timer(f): # f 是函数名
def inner(*args, **kwargs): # 闭包
start = time.time()
ret = f(*args, **kwargs)
end = time.time()
total = end - start
print(total)
return ret
return inner @timer # f1 = timer(f1),语法糖简化代码
def f1(a, **kwargs): # 参数,返回值 *args和**args可以组成任意类型的参数
time.sleep(1)
print("Hello, World!", a, kwargs)
return "abc" ret = f1(1, name='tom')
print(ret)
五、装饰器的固定模式
def wrapper(f): # 装饰器
def inner(*args, **kwargs):
# 在原函数(被装饰)前增加的功能
ret = f(*args, **kwargs) # 被装饰的函数
# 在原函数(被装饰)后增加的功能
return ret
return inner @wrapper # f1 = wrapper(f1)
def f1(*args, **kwargs):
print("Hello World!", args, kwargs)
return args ret = f1('a', 'b', name='tom') # f1指向的内存地址是inner指向的内存地址
print(ret)
巧记:1.先定义函数,再定义内部函数,返回内部函数的函数名
2.内部函数内放被装饰的函数,传进被装饰函数的函数名
3.被装饰的参数需要参数和返回值
PS:参数的传递:接收聚合,调用打散
python 装饰器-初识的更多相关文章
- python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
随机推荐
- Java中try catch finally执行
直接上代码实例: public static void main(String[] args) { System.out.println(test1()); } static int test1 ...
- 算法提高 密码锁 (BFS)
问题描述 你获得了一个据说是古代玛雅人制作的箱子.你非常想打开箱子看看里面有什么东西,但是不幸的是,正如所有故事里一样,神秘的箱子出现的时候总是会挂着神秘的锁. 这个锁上面看起来有 N 个数字,它 ...
- 2018-2-13-C#-解析-sln-文件
title author date CreateTime categories C# 解析 sln 文件 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23 ...
- 2018-10-19-jekyll-添加-Valine-评论
title author date CreateTime categories jekyll 添加 Valine 评论 lindexi 2018-10-19 09:10:40 +0800 2018-2 ...
- 2018-2-13-Xamarin-Forms-进度条控件
title author date CreateTime categories Xamarin Forms 进度条控件 lindexi 2018-2-13 17:23:3 +0800 2018-2-1 ...
- 【35.53%】【POJ 2912】Rochambeau
Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2837 Accepted: 1008 Description N childre ...
- Qt4与Qt3的主要不同
Qt4与Qt3的主要不同 1)QT4 中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的 工作是巨大的,这 ...
- 几个关于2-sat的题
几个关于2-sat的题 HDU3062 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3062 题意: 从2n个人去宴会,有 m条关系 i和j不能同时去 ...
- 阿里云 CentOS8 Repo
# CentOS-Base.repo # # The mirror system uses the connecting IP address of the client and the # upda ...
- Docker 安装nginx 与端口映射
1. 拉取镜像(网易云docker镜像仓库) docker pull hub.c.163.com/library/nginx:latest 2. 运行nignx,并做端口映射 -d 后台运行 -p映 ...