面试的时候,经常被问过装饰器,所以掌握好装饰器非常重要。
一.装饰器形成的过程: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. NoSQL:

    NoSQL:NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL". 在现代的计算系统上每天网络上都会产生庞大的数据量. 这些数据有很大一部分是由关系数据 ...

  2. POJ 1149:PIGS 网络流经典题

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18345   Accepted: 8354 Description ...

  3. Centos下nginx安装

    安装很简单,这里记录只是为了记下下载地址: A.[root@localhost soft]# wget http://nginx.org/download/nginx-1.4.2.tar.gz B.[ ...

  4. try,catch,finally尝试(一个程序块多个catch)

    曾学过c++,但是对这些异常捕捉不是很了解,通过别的编程语言了解 public class newclass { public static void main(String[] args) { tr ...

  5. winform使用钩子限制windows热键

    新增类KeybordHookProc using System; using System.Collections.Generic; using System.Diagnostics; using S ...

  6. clonezilla使用说明

    0.Clonezilla Live 再生龙网址:http://clonezilla.nchc.org.tw/clonezilla-live/ 1.下载Clonezilla Live 地址:http:/ ...

  7. C/C++学习笔记-gcc动态库及静态库

    gcc工作流程 1.预处理 gcc -E 2.编译 gcc -S 3.汇编 gcc -c 4.链接 没参数制作静态库: 1.命名规则:libMyName.a2.制作步骤: ①.生成.o gcc -c ...

  8. tp5 输入域名即访问指定页面

    遇到PC官网类型的项目,经常会遇到隐藏入口文件和输入域名即可打开官网首页的需求.需要修改站点的默认加载文件和伪静态的配置才可以生效. 以下为nginx1.15版本,宝塔面板的修改方式.修改入口文件为w ...

  9. JaveSE--getResource

    System.out.println(ConfigUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath()); ...

  10. YouTube推出慈善组合工具,能引国内视频网站跟风吗?

    互联网的出现不仅仅让大众的工作和生活更便利,更深度改变着传统事物的形态,让其被更多人广泛地认知并接触到.如,原本在线下通过彩页.手册.横幅等进行宣传.募捐的慈善,就通过互联网展现出更为强大的影响力.而 ...