python装饰器代码的示例分析
发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,这篇文章主要介绍python装饰器代码的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.装饰器通用模型def wrapper(fn): def inner(*a
千家信息网最后更新 2024年11月25日python装饰器代码的示例分析
这篇文章主要介绍python装饰器代码的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
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@admindef play_dnf(username, password): print(f'开始玩DNF,账号:{username},密码:{password}') print('刀斩肉身,心斩灵魂') return '掉落:戮蛊的哀鸣炮'@admindef 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 innerdef wrapper2(fn): def inner(*args, **kwargs): print('这是w2进入') ret = fn(*args, **kwargs) print('这是w2出去') return ret return inner@wrapper1@wrapper2def 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')@Foodef bar(): print ('bar')bar()
以上是"python装饰器代码的示例分析"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
函数
参数
这是
代码
多个
示例
分析
世界
使者
关键
内容
回音
密码
日志
服务器
灰烬
灵魂
种族
篇文章
精灵
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
米内数据库
软件开发需不需要资质证书
超市财务软件开发
防骗大数据 防骗云数据库
数据库表结构设计优化
欧洲服务器ip
郑州软件开发app公司哪家好
软件开发一般需要学些什么
平板提示找不到服务器
软件开发人才紧缺吗
智慧农业系统软件开发
多媒体法治主题展馆软件开发
达内科技 互联网培训机构
不属于软件开发阶段任务
如何备份使用数据库文件
澳大利亚笔记软件开发
服务器供应
服务器内存扩容后网络不通
有一个人事系统数据库
软件开发哪个三本大学好
浙江弘瑞网络技术公司
软件开发好学业务好学
如何修改云服务器主机名
mqtt 服务器要自己实现吗
网络技术小测验理论
黑龙江什么是网络技术服务优势
藏宝阁不同服务器能交易吗
那个服务器打开好可以吗
服务器测试显卡的口令
无法登录u8管理服务器