python装饰器(基础中的重点)
一、简单的装饰器
1.为什么要使用装饰器呢?
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
装饰器的本质:就是一个闭包函数
那么我们先来看一个简单的装饰器:实现计算每个函数的执行时间的功能
import time
def wrapper(func):
def inner():
start=time.time()
func()
end=time.time()
print(end-start)
return inner
def hahaha():
time.sleep(1)
print('aaaaa')
hahaha=wrapper(hahaha)
hahaha()
简单的装饰器
上面的功能有点不简介,不完美,下面就引进了语法糖。
import time
def wrapper(func):
def inner():
start=time.time()
func()
end=time.time()
print(end-start)
return inner
@wrapper
def kkk():#相当于kkk=wrapper(kkk)
print('aaaaa')
kkk()
装饰器-------语法糖
以上的装饰器都是不带参数的函数,现在装饰一个带参数的该怎么办呢?
import time
def timer(func):
def inner(*args,**kwargs):
start = time.time()
re = func(*args,**kwargs)
end=time.time()
print(end- start)
return re
return inner
@timer #==> func1 = timer(func1)
def func1(a,b):
print('in func1')
print(a,b)
@timer #==> func1 = timer(func1)
def func2(a):
print('in func2 and get a:%s'%(a))
return 'fun2 over'
func1(1,2)
print(func2('aaaaaa'))
原函数带多个参数的装饰器
import time
def timer(func):
def inner(*args,**kwargs):
start = time.time()
re = func(*args,**kwargs)
end=time.time()
print(end - start)
return re
return inner
@timer #==> func1 = timer(func1)
def jjj(a):
print('in jjj and get a:%s'%(a))
return 'fun2 over'
jjj('aaaaaa')
print(jjj('aaaaaa'))
带返回值的装饰器
二、开放封闭原则
1.对扩展是开放的
2.对修改是封闭的
三、装饰器的固定结构
import time
def wrapper(func): # 装饰器
def inner(*args, **kwargs):
'''函数执行之前的内容扩展'''
ret = func(*args, **kwargs)
'''函数执行之前的内容扩展'''
return ret
return inner
@wrapper # =====>aaa=timmer(aaa)
def aaa():
time.sleep(1)
print('fdfgdg')
aaa()
四、带参数的装饰器
带参数的装饰器:就是给装饰器传参
用处:就是当加了很多装饰器的时候,现在忽然又不想加装饰器了,想把装饰器给去掉了,但是那么多的代码,一个一个的去闲的麻烦,那么,我们可以利用带参数的装饰器去装饰它,这就他就像一个开关一样,要的时候就调用了,不用的时候就去掉了。给装饰器里面传个参数,那么那个语法糖也要带个括号。在语法糖的括号内传参。在这里,我们可以用三层嵌套,弄一个标识为去标识。如下面的代码示例
# 带参数的装饰器:(相当于开关)为了给装饰器传参
# F=True#为True时就把装饰器给加上了
F=False#为False时就把装饰器给去掉了
def outer(flag):
def wrapper(func):
def inner(*args,**kwargs):
if flag:
print('before')
ret=func(*args,**kwargs)
print('after')
else:
ret = func(*args, **kwargs)
return ret
return inner
return wrapper
@outer(F)#@wrapper
def hahaha():
print('hahaha')
@outer(F)
def shuangwaiwai():
print('shuangwaiwai')
hahaha()
shuangwaiwai()
给装饰器加参数
五、多个装饰器装饰一个函数
def qqqxing(fun):
def inner(*args,**kwargs):
print('in qqxing: before')
ret = fun(*args,**kwargs)
print('in qqxing: after')
return ret
return inner
def pipixia(fun):
def inner(*args,**kwargs):
print('in qqxing: before')
ret = fun(*args,**kwargs)
print('in qqxing: after')
return ret
return inner
@qqqxing
@pipixia
def dapangxie():
print('饿了吗')
dapangxie()
'''
@qqqxing和@pipixia的执行顺序:先执行qqqxing里面的 print('in qqxing: before'),然后跳到了pipixia里面的
print('in qqxing: before')
ret = fun(*args,**kwargs)
print('in qqxing: after'),完了又回到了qqqxing里面的 print('in qqxing: after')。所以就如下面的运行结果截图一样
'''
多个装饰器装饰一个函数
上例代码的运行结果截图
六、统计多少个函数被装饰了的小应用
统计多少个函数被我装饰了
l=[]
def wrapper(fun):
l.append(fun)#统计当前程序中有多少个函数被装饰了
def inner(*args,**kwargs):
# l.append(fun)#统计本次程序执行有多少个带装饰器的函数被调用了
ret = fun(*args,**kwargs)
return ret
return inner
@wrapper
def f1():
print('in f1')
@wrapper
def f2():
print('in f2')
@wrapper
def f3():
print('in f3')
print(l)
统计多少个函数被装饰了
python装饰器(基础中的重点)的更多相关文章
- Python装饰器基础
一.Python装饰器引入 讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个 ...
- Python装饰器基础及运行时间
一.装饰器基础 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会处理被装饰的函数,然后把他返回,或者将其替换成另一个函数或可调用对象. eg:decorate装饰器 @decor ...
- python装饰器基础及应用
一.简介 装饰器是是修改其它函数功能的函数:其意义是让其他函数在不修改任何代码的前提下增加额外功能 二.数据类型 首先我们来看一段简单的代码: from types import MethodType ...
- Python基础(五) python装饰器使用
这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...
- Python开发基础-Day7-闭包函数和装饰器基础
补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其 ...
- Python 装饰器装饰类中的方法
title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...
- python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...
- [python 基础]python装饰器(一)添加functools获取原函数信息以及functools.partial分析
python装饰器学习的时候有两点需要注意一下 1,被装饰器装饰的函数取其func.__name__和func.func_doc的时候得到的不是被修饰函数的相关信息而是装饰器wrapper函数的doc ...
- python装饰器在接口自动化测试中的应用
在讲解装饰器在接口自动化测试项目的应用之前,我们先来介绍一下python装饰器到底是个什么 装饰器 说装饰器就不得不提一下函数这个一等公民了,在python中函数有几个特性先来了解一下 函数的一些特性 ...
- day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)
1. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...
随机推荐
- c# 实现ComboBox自动模糊匹配
ComboBox自带有属性可以实现自动匹配,但是它有一个弊端,只能从头开始匹配,例如"李四LS",只能输入“李四”或"李"才能匹配出来,而输入"LS& ...
- JS同步执行代码
new Promise(function(){initAppToken()}).then(()=> getApps(this.pageInfo).then ...
- Spring AOP 简单应用,对请求参数进行拦截处理
AOP的主要角色 切面:使用切点表达式表示,指定了当前切面逻辑所要包裹的业务模块的范围大小: Advice:也即切面逻辑,指定了当前用于包裹切面指定的业务模块的逻辑 Advice的主要类型 @Befo ...
- 2019-9-2-visual-studio-2015-warning-MSB3246
title author date CreateTime categories visual studio 2015 warning MSB3246 lindexi 2019-09-02 12:57: ...
- javaweb各种框架组合案例(八):springboot+mybatis-plus+restful
一.介绍 1. springboot是spring项目的总结+整合 当我们搭smm,ssh,ssjdbc等组合框架时,各种配置不胜其烦,不仅是配置问题,在添加各种依赖时也是让人头疼,关键有些jar包之 ...
- opencv windows源码编译
WITH_QT//H:\software\programming\qt\5.12.3\mingw73_32\lib\cmake 5.6的路径要改这样 WITH_OPENGL 编译器mingw32-m ...
- 随笔3 HashMap<K,V>
equals.hashcode和==的区别 在介绍HashMap之前,我想先阐述一下我对这三者的理解,equals这个方法呢,就是在判断是否为同一对象(注意,这里的同一对象和相同的内存地址是不同的), ...
- 漫谈五种IO模型
阅读目录 1 基础知识回顾 2 I/O模式 3 事件驱动编程模型 网络编程里常听到阻塞IO.非阻塞IO.同步IO.异步IO等概念,搞清楚这些概念之前,还得先回顾一些基础的概念. 1 基础知识回顾 注意 ...
- [BZOJ] IOI2015 Boxes纪念品盒
问题描述 IOI2015 开幕式正在进行最后一个环节.按计划在开幕式期间,每个代表队都将收到由主办方发放的一个装有纪念品的盒子.然而所有志愿者都被精彩的开幕式所吸引,除 Aman外其他人完全忘记了发放 ...
- POJ 3660 Cow Contest ( 最短路松弛思想应用 && Floyd求传递闭包 )
题意 : 给出 N 头奶牛在比赛的结果,问你最多的能根据给出结果确定其名次的奶牛头数.结果给出的形式为 A B 代表在比赛当中 A 战胜了 B 分析 : 对于一头奶牛来说,如果我们能确定其他 N - ...