python装饰器代码解析

python装饰器代码解析

目录

1.装饰器通用模型

2.多个装饰器装饰的函数执行

3.带参数的装饰器

4.类装饰器

1.装饰器通用模型 def wrapper(fn):     def inner(*args, **kwargs):         ret = fn(*args, **kwargs)         return ret     return inner

装饰器几个关键点:

1.函数可以当参数传递

2.函数可以作为返回值进行返回

3.函数名称可以当成变量一样进行赋值操作

装饰器本质上是个闭包,在不改变原有函数调用的情况下,给函数增加新的功能

举个例子:

def admin(game):     def inner(*args, **kwargs):  # inner添加了参数,args 一定是个元组 kwargs 一定是字典         print('打开Wg')         result = game(*args, **kwargs)  # * ** 表示把args元组和kwargs打散成位置参数,关键字参数传递进去         print('关闭Wg')         return result     return inner @admin def play_dnf(username, password):     print(f'开始玩DNF,账号:{username},密码:{password}')     print('刀斩肉身,心斩灵魂')     return '掉落:戮蛊的哀鸣炮' @admin def play_wow(race, occupation, server_name, camp):     print(f'开始玩魔兽世界,种族:{race},职业:{occupation},服务器:{server_name},阵营:{camp}')     print('为了辛多雷的荣耀')     return '掉落:灰烬使者' if __name__ == '__main__':     ret1 = play_dnf('大马猴', '888888')     print(ret1)     ret2 = play_wow('血精灵', '圣骑士', '回音山', '部落')     print(ret2)

这代码还是很好懂的,我就不解释了,然后是执行结果如下:

python demo.py
打开Wg
开始玩DNF,账号:大马猴,密码:888888
刀斩肉身,心斩灵魂
关闭Wg
掉落:戮蛊的哀鸣炮
打开Wg
开始玩魔兽世界,种族:血精灵,职业:圣骑士,服务器:回音山,阵营:部落
为了辛多雷的荣耀
关闭Wg
掉落:灰烬使者

Process finished with exit code 0

2.多个装饰器装饰的函数执行

一个函数被多个装饰器装饰,又将如何执行呢?

def wrapper1(fn):     def inner(*args, **kwargs):         print('这是w1进入')         ret = fn(*args, **kwargs)         print('这是w1出去')         return ret     return inner def wrapper2(fn):     def inner(*args, **kwargs):         print('这是w2进入')         ret = fn(*args, **kwargs)         print('这是w2出去')         return ret     return inner @wrapper1 @wrapper2 def target():     print('我是目标') if __name__ == '__main__':     target()

直接给出执行顺序:

一个函数被多个装饰器装饰的执行顺序

# w1 w2 target w2 w1

3.带参数的装饰器

装饰器的语法允许我们在调用时,提供其它参数,比如@decorator(a)。这样,就为装饰器的编写和使用提供了更大的灵活性。
(在上面又套了一层函数)
比如,我们可以在装饰器中指定日志的等级,因为不同业务函数可能需要的日志级别是不一样的。

def use_logging(level):     def decorator(func):         def wrapper(*args, **kwargs):             if level == "warn":                 logging.warn("%s is running" % func.__name__)             elif level == "info":                 logging.info("%s is running" % func.__name__)             return func(*args)         return wrapper     return decorator @use_logging(level="warn") def foo(name='foo'):     print("i am %s" % name) foo() 4.类装饰器

没错,装饰器不仅可以是函数,还可以是类,相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。使用类装饰器主要依靠类的__call__方法,当使用 @ 形式将装饰器附加到函数上时,就会调用此方法。

class Foo(object):     def __init__(self, func):         self._func = func     def __call__(self):         print ('class decorator runing')         self._func()         print ('class decorator ending') @Foo def bar():     print ('bar') bar()

到此这篇关于python装饰器代码解析的文章就介绍到这了,更多相关python装饰器内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    excel中乘法函数是什么?

    excel中乘法函数是什么?,乘法,函数,什么,打开表格,在C1单元格中输入“=A1*B1”乘法公式。以此类推到多个单元。1、A1*B1=C1的Excel乘法公式

    标准差excel用什么函数?

    标准差excel用什么函数?,函数,标准,什么,在数据单元格的下方输入l标准差公式函数公式“=STDEVPA(C2:C6)”。按下回车,求出标准公差值。详细

    excel常用函数都有哪些?

    excel常用函数都有哪些?,函数,哪些,常用,1、SUM函数:SUM函数的作用是求和。函数公式为=sum()例如:统计一个单元格区域:=sum(A1:A10)  统计多个

    cpu所有电脑都通用吗|电脑CPU通用吗

    cpu所有电脑都通用吗|电脑CPU通用吗,,1. 电脑CPU通用吗CPU和主板并不是都通用。CPU与主板搭配的最基本要求就是接口要对应。现在Intel产品

    做模型电脑|电脑上做模型的软件

    做模型电脑|电脑上做模型的软件,,电脑上做模型的软件建模软件 中文名 ;sketchup渲染软件 主要用在建筑方案中:对建筑造型的推敲 现在G

    电脑显示器模型定制|曲面显示器建模

    电脑显示器模型定制|曲面显示器建模,,曲面显示器建模可以,但效果还是平面的好。曲面屏显示器的优点:1.更广的视野(在同尺寸下,视角效果更广,视