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

    1346 递归 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 函数f(n,m) { 若n=1或m=1返回a[n][m]; 返回f(n-1,m)异或 ...

  2. Mysql--主库不停机搭建备库

    参考:http://blog.csdn.net/luozuolincool/article/details/38494817 mysqldump --skip-lock-tables --single ...

  3. CNN:扩张卷积输出分辨率计算

    扩张卷积(Dilated convolutions)是另一种卷积操作,也叫做空洞卷积(Atrous convolution).相比于普通的卷积,相同的卷积核,空洞卷积能够拥有更大的感受野. 相同的卷积 ...

  4. 《C Primer Plus》- 第二章 C语言概述

    本笔记写于2020年1月27日. 本系列文章参考的是<C Primer Plus>(第六版),其中里面会有笔者自己的相关补充. 以下示例均运行于macOS Catalina 10.15.2 ...

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

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

  6. .NET技术-2.0. 操作数据库-Dapper

    .NET技术-2.0. 操作数据库-Dapper 项目参见: 1. 为什么选择Dapper 1) 性能优越: 其实在各大网站上,我们大概都会看到这样的一个对比效果图,在超过500次poco seria ...

  7. 实验吧web-易-what a fuck!这是什么鬼东西?

    打开链接是一大串符号,是js编码的一种,全部复制下来,粘贴在控制台中回车就拿到flag了.

  8. 吴裕雄--天生自然 JAVASCRIPT开发学习: DOM

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. UVa-679 Dropping Balls 二叉树

    题目链接:https://vjudge.net/problem/UVA-679 题意: 有一棵二叉树,所有节点从上至下,从左到右依次编号为1.2...2D-1,叶子深度都相同,有I个小球,从根节点依次 ...

  10. RaspBerry--解决无法用 ssh 直接以 root 用户登录

    参考:https://www.cnblogs.com/xwdreamer/p/6604593.html 以普通用户登录,然后切换至 root 用户. 编辑 /etc/ssh/sshd_config 添 ...