自学Python之路-Python基础+模块+面向对象
自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django

自学Python4.3-装饰器固定格式

1.装饰有返回值的装饰器

import  time
print(time.time()) def timmer(f): #装饰器函数
def inner():
start = time.time()
ret = f() #被装饰的函数
end = time.time()
print(end - start)
return ret
return inner @timmer #语法糖 @装饰器函数名
def func(): #被装饰的函数
time.sleep(0.01)
print('我好喜欢大家啊~')
return '新年好'
# func = timmer(func)
ret = func() #inner()
print(ret)  

以上代码:
   执行timmer(func), 返回inner  (此时此刻func就是inner)  执行func的时候就是执行inner, 所以在inner里面加个返回值

2. 装饰带参数函数的装饰器

2.1 如果被装饰函数有参数, 有一个参数:

import  time
print(time.time()) def timmer(f): #装饰器函数
def inner(a):
start = time.time()
ret = f(a) #被装饰的函数
end = time.time()
print(end - start)
return ret
return inner @timmer #语法糖 @装饰器函数名
def func(a): #被装饰的函数
time.sleep(0.01)
print('我好喜欢大家啊',a)
return '新年好'
# func = timmer(func)
ret = func(1) #inner()
print(ret)

2.2  如果被装饰函数有参数, 有2个参数:

import  time
print(time.time()) def timmer(f): #装饰器函数
def inner(a,b):
start = time.time()
ret = f(a,b) #被装饰的函数
end = time.time()
print(end - start)
return ret
return inner @timmer #语法糖 @装饰器函数名
def func(a,b): #被装饰的函数
time.sleep(0.01)
print('我好喜欢大家啊',a,b)
return '新年好'
# func = timmer(func)
ret = func(2598,2417) #inner()
print(ret)

2.3  如果被装饰函数有2个,一个函数有1个参数, 另一个函数有2个参数:

import  time
print(time.time()) def timmer(f): #装饰器函数
def inner(*args):
start = time.time()
ret = f(*args) #被装饰的函数
end = time.time()
print(end - start)
return ret
return inner @timmer #语法糖 @装饰器函数名
def func1(a): #被装饰的函数func1
time.sleep(0.01)
print('我好喜欢大家啊',a)
return '新年好'
# func = timmer(func)
def func2(a,b): #被装饰的函数func2
time.sleep(0.01)
print('我爱大家啊',a,b)
return '过年好'
# func = timmer(func)
ret = func1(48785) #inner()
ret = func2(2598,2417) #inner()
print(ret)

以上只解决了按位置传参数, 但是如果按关键字传参数就会有问题。于是,  可传万能参数

import  time
print(time.time()) def timmer(f): #装饰器函数
def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs) #被装饰的函数
end = time.time()
print(end - start)
return ret
return inner @timmer #语法糖 @装饰器函数名
def func1(a): #被装饰的函数func1
time.sleep(0.01)
print('我好喜欢大家啊',a)
return '新年好'
# func = timmer(func)
def func2(a,b): #被装饰的函数func2
time.sleep(0.01)
print('我爱大家啊',a,b)
return '过年好'
# func = timmer(func)
ret = func1(48785) #inner()
ret = func2(2598,b=2) #inner()
print(ret)

3. 引出---装饰器的固定格式

def wrapper(f):    #装饰器函数,f是被装饰的函数
def inner(*args,**kwargs):
'''在被装饰函数之前要做的事'''
ret = f(*args,**kwargs) #被装饰的函数
'''在被装饰函数之后要做的事'''
return ret
return inner
@wrapper #语法糖 @装饰器函数名
def func(a,b): #被装饰的函数
time.sleep(0.01)
print('我好喜欢大家',a,b)
return '新年好'
ret = func()  

注意点:

  • func 是被装饰的函数
  • 调用所有被装饰的函数,其实就是调用的inner

 单独打印*args,会将参数打散,输出每一个参数。(接收是聚合,调用是打散)

所以以下的例子,inner(*args) 相当于inner(1,2,3,4)

 举例代码:

def wrapper(func):
def inner(*args,**kwargs):
print('在被装饰的函数执行之前做的事')
ret = func(*args,**kwargs)
print('在被装饰的函数执行之后做的事')
return ret
return inner @wrapper #holiday = wrapper(holiday)
def holiday(day):
print('全体放假%s天'%day)
return '好开心' ret = holiday(3)
print(ret)

  • 1. 执行def wrapper(func) ,放到内存
  • 2. 执行holiday=wrapper(holiday)的右部分,传给wrapper下面代码
  • 3. 执行def inner(*args,**kwargs)
  • 4. return inner 返回地址
  • 5. 返回地址给holiday , 赋值
  • 6. 执行ret=holiday(3)右部分,  就是相当于inner(3)
  • 7. 执行inner函数,print('在被装饰的函数执行之前做的事')
  • 8. ret = func(*args,**kwargs)  相当于holiday(*(3),**{})
  • 9. 执行函数holiday(3),print('全体放假%s天'%day)
  • 10. return “好开心”
  • 11. 返回值给ret = func(*args,**kwargs) 的左部分
  • 12. print('在被装饰的函数执行之后做的事')
  • 13. return ret ,拿到返回值“好开心”
  • 14.返回值给holiday=wrapper(holiday)的左部分
  • 15.print(ret)

...

自学Python4.3-装饰器固定格式的更多相关文章

  1. 自学Python4.4-装饰器的进阶

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  2. 自学Python4.5-装饰器举例

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  3. 自学Python4.2-装饰器

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  4. 自学Python4.6-迭代器

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  5. python--4、装饰器

    装饰器(Decorator) 使用场景:为被装饰器装饰的函数增加功能,但又不希望修改函数的定义,即在代码运行期间动态增加功能. 装饰器更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也 ...

  6. day11(python)装饰器

    def wrapper(f):#1 def inner(*args,**kwargs):#3 ret = f(*args,**kwargs)#5 return ret#8 return inner#4 ...

  7. python基础-5.2装饰器

    1.了解装饰器前准备 #### 第一波 #### def foo(): print 'foo' foo #表示是函数,仅指向了函数的地址,为执行 foo() #表示执行foo函数 #### 第二波 # ...

  8. python之装饰器函数

    本章内容 引入 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 引入 作为一个会写函数的python开发,我们从今天开始要去公司上班了.写了一 ...

  9. python之路——装饰器函数

    阅读目录 楔子 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 返回顶部 楔子 作为一个会写函数的python开发,我们从今天开始要去公司上班 ...

随机推荐

  1. mysql实现成绩表中成绩的排名

    有这样的一个表: 如果两个分数相同,则两个分数排名(Rank)相同平分后的下一个名次应该是下一个连续的整数值. 因此,名次之间不应该有“间隔”! 此时有2种方法: 第一: select grade, ...

  2. Elasticsearch IK+pinyin

    如何在Elasticsearch中安装中文分词器(IK+pinyin)   如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题——中文词语被分成了一个一个的汉字 ...

  3. CentOS7 修改MAC地址

    CentOS7 修改MAC地址 - mixboot - CSDN博客https://blog.csdn.net/u010953692/article/details/79650522

  4. Arrays.copyOf() 和 System.arrayCopy()分析

    java数组的拷贝四种方法:for.clone.System.arraycopy.Arrays.copyof public class Test1 { public static void main( ...

  5. 在浏览器上安装 Vue Devtools工具

    Vue.js devtools是基于google chrome浏览器的一款调试vue.js应用的开发者浏览器扩展,可以在浏览器开发者工具下调试代码. 1)首先在github下载devtools源码,地 ...

  6. python中的 list (列表)append()方法 与extend()方法的用法 和 区别

    参考: https://www.cnblogs.com/xuchunlin/p/5479119.html

  7. Gatsby & React & NPX & NVM

    Gatsby & React Gatsby is a blazing fast modern site generator for React. https://www.gatsbyjs.or ...

  8. 开发中遇到的css兼容问题

    1. overflow: scroll(平台兼容) 在Mac中的Chrome浏览器中,内容不超过容器时不会出现滚动条: 在Wins中的Chorme浏览器中,内容不超过容器时也会出现滚动条. 解决方法: ...

  9. Python——数组模块(array)

    一.模块说明 array模块是python中实现的一种高效的数组存储类型.它和list相似,但是所有的数组成员必须是同一种类型,在创建数组的时候,就确定了数组的类型. 二.代码

  10. WGS84,GCJ02, BD09坐标转换

    public class Gps { private double wgLat; private double wgLon; public Gps(double wgLat, double wgLon ...