python中如何理解装饰器代码?

港龙文化 2024-05-30 01:51:40
最佳回答
@author:by runsen@date:2019年07月11日1.1 装饰器入门1.2 带参数的装饰器2.1 类装饰器2.2 装饰器的嵌套3.1 身份认证3.2 日志记录3.3 输入合理性1、装饰器1.1 装饰器入门装饰器,顾名思义,就是用来“装饰”的。比如@runsen就是一个装饰器,其中"runsen"是你的装饰器的名字。它能装饰的东西有:函数、类。先看两段代码,在这里my_decorator()就是一个装饰器,其实装饰器就是一个函数来的函数def my_decorator(func):def wrapper():print('wrapper of decorator')func()return wrapperdef greet():print('hello world')greet = my_decorator(greet)greet()# 输出wrapper of decoratorhello worldmy_decorator函数传入greet函数名方法,中间有一个wrapper内函数方法, return wrapper说明要执行wrapper内函数,wrapper内函数,执行greet函数名方法greet = my_decorator(greet)这个代码可以用装饰器来替代,在greet上面加一个@my_decorator,直接执行greet()def my_decorator(func):def wrapper():print('wrapper of decorator')func()return wrapper@my_decoratordef greet():print('hello world')greet()wrapper of decoratorhello world装饰器就是继承了 my_decorator函数,因此先调用my_decorator中的wrapper打印出 wrapper of decorator,然后func()被调用,指的就是 greet(),所以在打印出hello world1.2 带参数的装饰器有时候函数需要传入参数,这时候用*args, **kwargs接受就可以了。def my_decorator(func):def wrapper(*args, **kwargs):print('wrapper of decorator')func(*args, **kwargs)return wrapperdef repeat(num):def my_decorator(func):def wrapper(*args, **kwargs):for i in range(num):print('wrapper of decorator')func(*args, **kwargs)return wrapperreturn my_decorator@repeat(4)def greet(**):print(**)greet('hello world')# 输出:wrapper of decoratorhello worldwrapper of decoratorhello worldwrapper of decoratorhello worldwrapper of decoratorhello world但是自定义参数的装饰器将改变函数本身的元信息,即函数不再是本身的函数**greet.__name__## 输出'wrapper'help(greet)# 输出help on function wrapper in module __main__:wrapper(*args, **kwargs)这时,需要使用内置模块functools.wrap会保留原函数的元信在源代码中@functools.wraps也是这么来的import functoo**ef my_decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):print('wrapper of decorator')func(*args, **kwargs)return wrapper@my_decoratordef greet(**):print(**)greet.__name__# 输出'greet'2、装饰器进阶2.1 类装饰器类装饰器主要依赖函数__call__ ,每当调用一个类的实例,函数__call__就会执行一次class count:def __init__(self, func):self.func = funcself.num_calls = 0def __call__(self, *args, **kwargs):self.num_calls += 1print('num of calls **: {}'.format(self.num_calls))return self.func(*args, **kwargs)@countdef example():print("hello world")example()# 输出num of calls **: 1hello worldexample()# 输出num of calls **: 2hello world2.2 装饰器的嵌套如果一个函数上面有多个装饰器,叫做装饰器的嵌套从下到上@decorator1@decorator2@decorator3def func():...那么相当于,从里到外decorator1(decorator2(decorator3(func)))import functoo**ef my_decorator1(func):@functools.wraps(func)def wrapper(*args, **kwargs):print('execute decorator1')func(*args, **kwargs)return wrapperdef my_decorator2(func):@functools.wraps(func)def wrapper(*args, **kwargs):print('execute decorator2')func(*args, **kwargs)return wrapper@my_decorator1@my_decorator2def greet(**):print(**)greet('hello world')# 输出execute decorator1execute decorator2hello world3、装饰器用法实例3.1 身份认证import functoo**ef authenticate(func):@functools.wraps(func)def wrapper(*args, **kwargs):request = args[0]if check_user_logged_in(request): # 如果用户处于登录状态return func(*args, **kwargs) # 执行函数 post_comment()else:ra**e exception('authentication failed')return wrapper@authenticatedef post_comment(request, ...)...3.2 日志记录import timeimport functoo**ef log_execution_time(func):@functools.wraps(func)def wrapper(*args, **kwargs):start = time.perf_counter()res = func(*args, **kwargs)end = time.perf_counter()print('{} took {} ms'.format(func.__name__, (end - start) * 1000))return resreturn wrapper@log_execution_timedef calculate_similarity(items):...3.3 输入合理性import functoo**ef validation_check(input):@functools.wraps(func)def wrapper(*args, **kwargs):... # 检查输入是否合法@validation_checkdef neural_network_training(param1, param2, ...):...所谓的装饰器,其实就是通过装饰器函数,来修改函数的一些功能,使得原函数不需要修改代码来源:极客时间python专栏 20210311
汇率兑换计算器

类似问答
  • **十大工程装饰公司排名情况如何
    • 2024-05-30 11:14:00
    • 提问者: 未知
    排名如下:1、东易日盛(**驰名商标,**最具实力的家居装饰集团之一,装饰装潢十大品牌,东易日盛家居装饰集团股份...装饰装潢十大品牌,上市公司,**建筑装饰行业百强企业,...
  • 梅花妆中古代的怎样的装饰?
    • 2024-05-30 01:05:17
    • 提问者: 未知
    但是梅花不是四季常开,于是她们 就把金箔剪成梅花形,贴在额上或者面颊 上,叫做“梅花妆”。梅花妆就成了宫廷 日妆,后来流传到民间,成为当时妇女争 相效仿的时尚之举。...
  • 看天怡美装饰如何为您解决六大装修风险!
    • 2024-05-30 03:56:14
    • 提问者: 未知
    你是否在担心设计师做不出理想的方案?你是否还在担心材料质量?你是否还在害怕施工工艺不过关?装修有
  • python的量化代码怎么用到股市中
    • 2024-05-30 15:58:34
    • 提问者: 未知
    (1) #按照市值从小到大的顺序活得n支股票的代码;(2) #分别对这一百只股票进行100支股票操作;(3) #获取从2016.05.01到2016.11.17的涨跌幅数据;(4) #选取记录大于40个的数据,去除次新股;(5) #将文件名名为“股票代码.csv”。
  • 如何理解子网掩码?
    • 2024-05-30 19:51:42
    • 提问者: 未知
    1100 0000.1010 1000.0000 0001.0000 0000的十进制:192.168.1.0 也就是说,从192.168.1.0到192.168.1.255都是同一个子网网段,里面的0—...255.255.255.192的二进制是多少?...
  • 如何在win7下安装python包工具pip
    • 2024-05-30 00:17:04
    • 提问者: 未知
    windows: 下载代码get-pip.py,运行该代码,这个代码会自动安装setuptools工具和pip 把python安装文件夹下的script目录加入环境变量path中(我的是"g:\software\python\scripts"),因为pip.exe 就在这个文件夹中。windows的dos命令行中:输入pip回车,可以看到帮助文档如下 可以使用 pip install...
  • 打印机错误代码5100 如何解决
    • 2024-05-30 21:32:29
    • 提问者: 未知
    1方法一:1》:打开机盖 2》:用手将墨盒向右方向推到尽 3》:关机盖 4》:关电源 5》:开电源 6》:开机盖 7》:观察墨盒是否自动向右滑动8》:趁墨盒滑动时用手助力再次往右位边稍微加力 9》: 感觉墨盒已经行到最尽 10》 :关上机盖2方法二:墨车受到阻力。轻度阻力,关闭电源重新启动可能就解决。如不能解决,开启电源,在墨车移出后即拉掉电源线断电,手推墨车看观察阻力和障碍。障碍可能由两个原因所...
  • ‘理光复印机’出现sc302故障代码要如何解决?
    • 2024-05-30 09:53:13
    • 提问者: 未知
    理光复印机出现sc302故障是内部硒鼓没反应,清理即可。1、首先向外打开理光复印机翻盖。2、然后理光复印机翻盖被打开。3、继续抽出理光复印机内部的硒鼓。4、之后掰开理光复印机的硒鼓盖。5、最后用棉签清理理光复印机的硒鼓里粉结块。
  • 宁波华创装饰口碑如何
    • 2024-05-30 13:09:29
    • 提问者: 未知
    个人觉得装饰公司的好坏取决于公司设计师的设计能力,能否根据业主的需求设计出好的格局和风格。还有就是公司工人的工艺水平。建议你到他们公司预约一个设计师好好沟通
  • 建筑装饰的前景如何
    • 2024-05-30 02:16:05
    • 提问者: 未知
    昆山市八维建筑装饰工程有限公司成立于1997年4月,主要从事室内设计、室内装饰施工、工程管理及工程顾问咨询。八维经营业务范围遍及上海、南京、北京、西安、重庆等重要城市、我们提供客户完善及专业的服务。室内设计:全面结合业主的企业形象,功能要求 工程施工:我们拥有丰富经验的工程师为业主完善...
汇率兑换计算器

热门推荐
热门问答
最新问答
推荐问答
新手帮助
常见问题
房贷计算器-九子财经 | 备案号: 桂ICP备19010581号-1 商务联系 企鹅:2790-680461

特别声明:本网为公益网站,人人都可发布,所有内容为会员自行上传发布",本站不承担任何法律责任,如内容有该作者著作权或违规内容,请联系我们清空删除。