面试的时候,经常被问过装饰器,所以掌握好装饰器非常重要。
一.装饰器形成的过程:1.最简单的装饰器。2.被装饰的函数有返回值。3.被装饰的函数有一个参数。4.被装饰的函数有多个位置参数。5.被装饰的函数有多个位置参数和关键字参数。
二.装饰器的作用:不修改被装饰的函数的代码和调用方式,增加新的功能。
三.原则:开放封闭原则。
四.语法糖:@wrapper
五.装饰器的固定模式。 一.装饰器形成的过程:1.最简单的装饰器。注意:下面代码没修改被装饰的函数的代码,但是调用使用了timmer(test)而不是test(),改变了调用方式,会导致
以前调用该函数的程序发生错误(如果以前有人使用过你写的函数)。
使用 时间函数 计算 代码 运行的时间
import time
def timmer(t): #timmer(t)是时间装饰器
start = time.time() #开始:函数开始运行的时间
time.sleep(0.01) #让函数睡眠0.01秒,否则打印的结果是0.0。
t() #过程:函数运算的过程。t()表示调用被装饰的函数。
end = time.time() #结束:函数结束运行的时间
print(end-start) #打印出运算的过程需要多少时间
def test():
print('今天必须非常努力,我要寻找热爱学习热爱工作的自己,我会为自己的努力而感到快乐幸福和满足')
timmer(test) #把需要计算运行时间的函数对象(或者说是地址)传给时间函数timmer 1.在不准修改test函数的情况下,装饰器发挥非常重要的作用:不修改test函数的代码,那么调用test函数的方式也不能修改,但是想在函数前后增加功能。
2.下面例子,test()这种调用函数的方式没有改变,但是给test函数增加了计算运行时间的功能。
3.开放封闭原则:对拓展(增加功能)是开放的,但是对修改被装饰的函数是封闭的。 一.装饰器形成的过程:1.最简单的装饰器:不修改被装饰的函数的代码和调用方式,使用了内部函数和闭包。
import time
def timmer(f): #装饰器函数
def inner():
start = time.time()
time.sleep(0.01)
f() #被装饰的函数
end = time.time()
print(end-start)
return inner #test=timmer(test)=inner,返回inner的id给timmer(test)
test = timmer(test)
def test():
print('今天必须非常努力,我要寻找热爱学习热爱工作的自己,我会为自己的努力而感到快乐和幸福和满足')
test() #test()=inner() #一.装饰器形成的过程:2.被装饰的函数有返回值。
import time
def timmer(f): #装饰器函数
def inner():
start = time.time()
time.sleep(0.01)
n = f() #被装饰的函数
end = time.time()
print(end-start)
return n
return inner #test=timmer(test)=inner,返回inner的id给timmer(test)
test = timmer(test)
def test(): #被装饰的函数
print('今天必须非常努力,我要寻找热爱学习热爱工作的自己,我会为自己的努力而感到快乐和幸福和满足')
return 10000000
print(test()) #test()=inner() #一.装饰器形成的过程:3.被装饰的函数有一个参数。
import time
def timmer(f): #装饰器函数
def inner(a):
start = time.time()
time.sleep(0.01)
n = f(a) #被装饰的函数
end = time.time()
print(end-start)
return n
return inner #test=timmer(test)=inner,返回inner的id给timmer(test)
test = timmer(test)
def test(a): #被装饰的函数
print('加油',a)
return 10000000
print(test(10000000)) #test(a)=inner(a) 一.装饰器形成的过程:4.被装饰的函数有多个位置参数。
import time
def timmer(f): #装饰器函数
def inner(*args):
start = time.time()
time.sleep(0.01)
n = f(*args) #被装饰的函数
end = time.time()
print(end-start)
return n
return inner #test=timmer(test)=inner,返回inner的id给timmer(test)
test = timmer(test)
def test(*args): #被装饰的函数
print('加油',args)
return 10000000
print(test(1,2,3)) #test(*args)=inner(*args) #一.装饰器形成的过程:5.被装饰的函数有多个位置参数和关键字参数。
import time
def timmer(f): #装饰器函数
def inner(*args,**kwargs):
start = time.time()
time.sleep(0.01)
n = f(*args,**kwargs) #被装饰的函数
end = time.time()
print(end-start)
return n
return inner #test=timmer(test)=inner,返回inner的id给timmer(test)
test = timmer(test)
def test(*args,**kwargs): #被装饰的函数
print('加油',args,kwargs)
return 10000000
print(test(1,2,3,t=8000000,m=10000000)) #test(*args,**kwargs)=inner(*args,**kwargs) 四.语法糖:@wrapper
import time
def timmer(f):
def inner():
start = time.time()
time.sleep(0.01)
n = f()
end = time.time()
print(end - start)
       return n
return inner
@timmer #语法糖@timmer相当于 func=timmer(func) 没有语法糖或func=timmer(func),装饰器就无法起作用。
def func():
print('今天继续加油')
func() 五.装饰器的固定模式。wrapper是装饰的意思。
def wrapper(f):
def inner(*args,**kwargs):
'''在被装饰的函数前面增加功能'''
ret = f(*args,**kwargs)
'''在被装饰的函数后面增加功能'''
return ret
return inner #上面五句话是装饰器的固定模式。
@wrapper
def func(*args,**kwargs):
return args,kwargs
print(func(1,2,3,m=10000000)) 六.装饰器的执行过程:
1. def wrapper(f):
4. def inner(*args,**kwargs):
7. '''在被装饰的函数前面增加功能'''
8. ret = f(*args,**kwargs)
9. '''在被装饰的函数后面增加功能'''
10. return ret #返回func(1,2,3,m=10000000)的返回值,因为第6步使用了print,所以被装饰的函数的返回值就被打印出来。
5. return inner #返回inner给wrapper(func),那么inner=wrapper(func)=func
3. @wrapper #func=wrapper(func)传参
2. def func(*args,**kwargs):
return args,kwargs
6. print(func(1,2,3,m=10000000)) #func=inner,相当于print(inner(1,2,3,m=10000000)),接着内部函数inner执行。
调用func函数实际上是调用了装饰器的内部函数:inner函数。

day04-函数,装饰器初成的更多相关文章

  1. python语法基础-函数-装饰器-长期维护

    ######################################################### # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 ...

  2. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  3. python装饰器1:函数装饰器详解

    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...

  4. python二 总结--函数-- 装饰器

    装饰器是什么? 有什么用? 为什么要用? 真的有用吗? 1.装饰器: 装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能. 原则:1.不能修改被装饰的函数的源代码          ...

  5. Python--函数对象@命名空间与作用域@包函数@装饰器@迭代器@内置函数

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  6. python语言中的函数装饰器

    装饰器 什么是装饰器? 装饰:给已有的对象(函数)添加新的功能 器:工具              在python中指具备某些功能的函数 装饰器:装饰器就是一个给其他函数增加功能的函数 一种设计原则: ...

  7. Python 函数装饰器简明教程

    定义类的静态方法时,就使用了装饰器.其实面向对象中的静态方法都是使用了装饰器. @staticmethod def jump(): print(" 3 meters high") ...

  8. python-Debug、函数装饰器

    Debug操作: 程序出问题的时候可以用debug来看一下代码运行轨迹,然后找找问题在哪里 1.先给即将debug的代码打上断点:  2.打完断点之后右键点击debug:  3.然后依次点击开始按钮让 ...

  9. Python函数装饰器原理与用法详解《摘》

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

随机推荐

  1. java获取配置文件信息

    两个类 package com.censoft.util; import java.util.Properties; import java.io.*; import java.util.ArrayL ...

  2. AT2000 Leftmost Ball 解题报告

    题面 给你n种颜色的球,每个球有k个,把这n*k个球排成一排,把每一种颜色的最左边出现的球涂成白色(初始球不包含白色),求有多少种不同的颜色序列,答案对1e9+7取模 解法 设\(f(i,\;j)\) ...

  3. 使用connected-react-router使router与store同步

    connected-react-router是一个绑定react-router到redux的组件,来实现双向绑定router的数据到redux store中,这么做的好处就是让应用更Redux化,可以 ...

  4. Mysql插入数据里有中文字符出现Incorrect string value的错误

    问题:Mysql插入数据里有中文字符出现Incorrect string value的错误   描述:CMD里直接敲代码插入数据   提示的部分截取为:ERROR 1366 (HY000): Inco ...

  5. 小程序调用wx.chooseLocation接口的时候无法获取权限(ios)

    ios手机小程序调用wx.chooseLocation接口的时候,获取权限的时候报authorize:fail:require permission desc这样子的错误,这是由于苹果的安全机制导致需 ...

  6. HTML5 Canvas——基础入门

    认识canvas html5的新标签 <canvas>标签只是图像容器,必须使用js来绘制图形 可以通过多种方法使用canvas绘制路径,盒,圆,字符以及添加图像 canvas画布 < ...

  7. bitcoind

    Bitcoin Core Daemon version v0.15.1.0-g7b57bc998f Usage: bitcoind [options] Start Bitcoin Core Daemo ...

  8. ZooKeeper解决的问题

    1.解决分布式单点问题 https://www.jianshu.com/p/08b76bd7a634 2.实现分布式环境数据的一致性.访问ZooKeeper树结构时,不同节点返回的数据是一致,不会引起 ...

  9. PROOF|ADOBE READER

    样稿PROOF,最后是印刷样张. 修改校样是最后一次修改错误. 每一版editor不一样,任务不同. 不能修改工作单位,但是可以加一个标注. 最好使用ADOBE READER中的COMMENT& ...

  10. Python—使用列表构造队列数据结构

    队列的概念 只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表:进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列):队列具有先进先出(FIFO)的特性. # _*_ ...