面试的时候,经常被问过装饰器,所以掌握好装饰器非常重要。
一.装饰器形成的过程: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. ubuntu16+caffe fast-rcnnCPU运行步骤

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  2. JavaEE--JNDI(下,实现)

    参考:https://blog.csdn.net/ouyida3/article/details/46699023  https://www.landui.com/help/show-6158.htm ...

  3. openstack trove 数据库镜像构建列表

    文件位置:/trove/integration/scripts/files/elements ubuntu@ubuntu:~/Downloads/trove/integration/scripts/f ...

  4. python爬取招聘网站数据

    # -*- coding: utf-8 -*- # 爬虫分析 from bs4 import BeautifulSoup from lxml import etree from selenium im ...

  5. Mysql时间范围分区(RANGE COLUMNS方式)

    1.创建测试表 CREATE TABLE `t_test` ( `id` ), `dates` DATETIME ); ALTER TABLE t_test ADD PRIMARY KEY (id); ...

  6. UVA 12663 第九届省赛 高桥与低桥 线段树

    题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次 看下数据10的五次方,10的五次方 ...

  7. [转]分析zookeeper能做什么

    Zookeeper是hadoop的一个子项目,虽然源自hadoop,但是我发现zookeeper脱离hadoop的范畴开发分布式框架的运用越来越多.今天我想谈谈zookeeper,本文不谈如何使用zo ...

  8. [De1CTF 2019]SSRF Me-MD5长度扩展攻击&CVE-2019-9948

    0x00 打开题目查看源代码,开始审计 这里贴上网上师傅的博客笔记: https://xz.aliyun.com/t/6050 #! /usr/bin/env python #encoding=utf ...

  9. 对Java面向对象中多态的理解

    理解的要点:多态意味着父亲的变量可以指向子类对象 面向对象程序设计的三大支柱是封装.继承和多态 封装对外把相应的属性和方法实现的细节进行了隐藏.继承关系使一个子类继承父亲的特征,并且加上了一些新的特征 ...

  10. python 删除文件

    import os 删除文件: os.remove() 删除空目录: os.rmdir() 递归删除空目录: os.removedirs() 递归删除目录和文件(类似DOS命令DeleteTree): ...