十六.装饰器

装饰器

由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。

>>> def now():
...     print ‘2013-12-25‘
...
>>> f = now
>>> f()
2013-12-25

函数对象有一个__name__属性,可以拿到函数的名字:

>>> now.__name__
‘now‘
>>> f.__name__
‘now‘

现在,假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

本质上,decorator就是一个返回函数的高阶函数。所以,我们要定义一个能打印日志的decorator,可以定义如下:

def log(func):
    def wrapper(*args, **kw):
        print ‘call %s():‘ % func.__name__
        return func(*args, **kw)
    return wrapper

观察上面的log,因为它是一个decorator,所以接受一个函数作为参数,并返回一个函数。我们要借助Python的@语法,把decorator置于函数的定义处:

@log
def now():
    print ‘2013-12-25‘

调用now()函数,不仅会运行now()函数本身,还会在运行now()函数前打印一行日志:

>>> now()
call now():
2013-12-25

@log放到now()函数的定义处,相当于执行了语句:

now = log(now)

由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。

wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数,写出来会更复杂。比如,要自定义log的文本:

时间: 2024-08-25 18:28:36

十六.装饰器的相关文章

Python进阶(六)----装饰器

Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: ? 增加一些额外的新功能 封闭原则: ? 不改变源码.以及调用方式 二丶初识装饰器 装饰器: ? 也可称装饰器函数,诠释开放封闭原则,装饰器的本质是闭包 ###普通版装饰器 import time def timmer(x): # x 接收的原函数的内存地址 def inner(): start_time=time.time() x() # 执行 原函数 print(f'执行效率{time.time()-start_time}'

(十)装饰器模式详解(与IO不解的情缘)

LZ到目前已经写了九个设计模式,回过去看看,貌似写的有点凌乱,LZ后面会尽量改进. 那么本章LZ和各位读友讨论一个与JAVA中IO有着不解情缘的设计模式,装饰器模式. 定义:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.                  这一个解释,引自百度百科,我们注意其中的几点. 1,不改变原类文件.                  2,不使用继承.                  3,动

十四 —— 装饰器

设置类属性 1.@property装饰器,是python内置的装饰器,可以把类的方法伪装成属性调用的方式, 2.python内置的builtins模块中的property()函数 property(get_age, set_age, del_age, "年龄"):前面三个参数是方法名.调用时自动执行的方法,最后一个参数是个字符串,他用来做描述 原文地址:https://www.cnblogs.com/KeenaCherry/p/12110212.html

Python学习(十)—— 装饰器和函数闭包

装饰器 装饰器:本质就是函数,功能是为其他函数添加附加功能 原则: 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 统计程序运行的时间(不使用装饰器): 这种方法修改了源代码,不能用于已经上线的程序 1 import time 2 def calc(l): 3 res = 0 4 start_time = time.time() 5 for i in l: 6 res += i 7 time.sleep(0.01) 8 stop_time = time.time() 9 print

Python(十) 函数式编程: 匿名函数、高阶函数、装饰器

一.lambda表达式 lambda parameter_list: expression # 匿名函数 def add(x,y): return x+y print(add(1,2)) f = lambda x,y: x+y print(f(1,2)) 二.三元表达式 # x >y ? x :y # 条件为真时返回的结果 if 条件判断 else 条件为假时的返回结果 x= 2 y=1 r = x if x > y else y print(r) # 2 三.map 四.map与lambda

兄弟连学Python 装饰器和抽象类

#装饰器:对类或者函数进行功能的扩展 ''' #第一步:基本函数 def la(): print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天') #调用函数 la() la() #第二步:扩展函数功能(不能修改原函数) #用于扩展基本函数的函数 def kuozhan(func): #扩展功能1 print('la前参拜祈求') #调用基本函数 func() #扩展功能2 print('la后还愿感谢') #基本函数 def la(): print('脚踏黄河两岸,手拿机密文件,前

15 装饰器

三十四.装饰器 1.开闭原则: 对功能的扩展开放,对代码的修改是封闭的(不可修改的)    目的:在目标函数前或后插入一段新的代码,不改变源代码 2.装饰器的通用语法 3.多个装饰器修饰同一个函数 4.带参数的修饰器 语法格式: 实例: 原文地址:https://www.cnblogs.com/lw1095950124/p/10197811.html

六、PYTHON 学习之装饰器使用

Python是一种强大的语言,即可浅尝辄止,也可深入挖掘.很适合做科学计算.数据挖掘等等.今天我将简单介绍一下Python的装饰器(Decorators)的用法 . 假设我们想要庆祝下生日,需要邀请一些朋友过来参加.但是你有个讨厌的朋友,叫Joe,必须不能让他来啊.可能首先你想到的是建一个list,然后迭代查找并移除所有的Joe童鞋.这当然是个好方法,但是这里为了介绍装饰器,我们会用@来完成这个工作.虽然可能看起来没有什么必要,但是有助于大家学习装饰器的用法. 首先创建一个Python文件app

Python 3 学习笔记(六)----装饰器

一.定义 装饰器本质是函数,装饰其他函数,就是为其它函数添加附加功能 二.装饰器原则 1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 三.实现装饰器的必要知识 1.函数即是变量 1 # def foo(): 2 # print("in the foo") 3 # bar() #bar未定义 4 # foo() 5 6 7 # def bar(): 8 # print("int the bar") 9 # def foo(): 10 # prin