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装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
随机推荐
- P1087 N个数的最大公约数
题目描述 今天灵灵学习了使用欧几里得算法(即:辗转相除法)求解两个数的最大公约数.于是他决定用这个方法求解 \(N\) 个数的最大公约数. 输入格式 输入的第一行包含一个整数 \(N(1 \le N ...
- H3C 示例:根据主机地址数划分子网
- 一排盒子,jq鼠标移入的盒子动画移出停止动画,css动画
css .category > div.active { animation: servicetobig 0.5s ease 1 forwards; } @keyframes serviceto ...
- vue面试的一些总结
vue中组件的data为什么是一个函数? 组件是可复用的vue实例,一个组件被创建好之后,就可能被用在各个地方,而组件不管被复用了多少次,组件中的data数据都应该是相互隔离,互不影响的,基于这一理念 ...
- 【37.48%】【hdu 2587】How far away ?(3篇文章,3种做法,LCA之树上倍增)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- 基于bmob后端云小程序开发——口袋吉他
人的一生90%的时间都在做着无聊的事情,社会的发展使得我们的闲暇时间越来越多,我们把除了工作的其他时间放在各种娱乐活动上. 程序员有点特殊,他们把敲代码看成娱乐活动的一部分,以此打发时间的不占少数.这 ...
- codeforces 600E E. Lomsat gelral (线段树合并)
codeforces 600E E. Lomsat gelral 传送门:https://codeforces.com/contest/600/problem/E 题意: 给你一颗n个节点的树,树上的 ...
- 关于js如果控制标签的字符长度
js名字长度限定(如限制为50个字符,超过的显示...) var new_playerName = ""; jQuery(".translate").each( ...
- Dubbo的核心组件、架构设计与Dubbo面试考点
1.Dubbo是什么? Dubbo 是一个分布式.高性能.透明化的 RPC 服务框架,提供服务自动注册.自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成. RPC 指的是远程调用协议, ...
- flask迁移数据库时报错:Target database is not up的解决方案
在flask中进行数据库迁移时报错,报错信息为"Target database is not up",解决方案如下 找到alembic的最新版本号,找到文件夹migrate下的最新 ...