当前位置: 首页 > 后端技术 > Python

Python装饰器

时间:2023-03-26 19:28:41 Python

装饰器核心python装饰器的核心是将一个函数作为参数传递给另一个函数体,也就是说在函数执行之前先执行装饰器函数。应用场景包括用户认证、日志写入、数据验证等,可以避免多段重复代码,提高代码复用性。下面由浅入深地介绍函数作为装饰器的三种基本形式。无参装饰器的代码#decoratorwithoutparametersdeffunc_name(func):definner():print('decoratorcalled')func()returninner@func_namedefs1():print('s1called')s1()#Startexecution#----------------执行结果--------------------#decoratorcalled#s1调用来解释这段代码。代码执行入口为s1()。这时解释器接触到func_name装饰器,所以此时s1()函数的执行被暂停,将s1作为参数带入装饰器函数,解释器开始执行func_name(s1)(),并根据func_name函数定义执行函数inner(),所以先printdecoratorcalled,继续打印s1called。这样,部分工作在函数执行之前就完成了。带参数的装饰器接下来会举一个用户认证的例子来说明。想象一下这样的场景。系统登录时,如果用户名和密码正确,则可以进入系统,否则拒绝进入。因此,用户认证是系统登录之前的一个功能。必经的一步。代码如下#Decoratorwithparametersdefdec(func):definner(*args,**kwargs):#s2parameterpassingprint('startdecoration')ifkwargs.get('user')=='root'andkwargs.get('password')=='dlut':print('验证通过')func(*args,**kwargs)#executes2()else:print('验证失败')#不执行s2()returninner@decdefs2(*args,**kwargs):print('开始求和,打印关键字~')print(sum(args))print(kwargs)s2(3,6,8,user='root',password='dlut')#函数入口#----------------执行结果--------------------#开始装饰#VerifyPass#开始求和,打印关键字~#17#{'user':'root','password':'dlut'}同样,执行带参数的s2()函数时,遇到dec装饰器通过给装饰器内部定义的inner()函数传入参数,以便获取相关参数供用户验证。如何用返回值修饰函数如何用返回值修饰函数?话不多说,代码如下#装饰一个有返回值的函数defdec2(func):definner(*args):print('开始装饰~')ret=func(*args)returnret#Return这里func_run函数的返回值returninner@dec2deffunc_run(*args):returnsum(args)_sum=func_run(1,4,6)#函数入口print('求和结果',_sum)#----------------执行结果--------------------#开始装饰~#求和结果11个类作为装饰器接下来我会分享一段代码给大家。关于类作为装饰器的使用,其作用是通过装饰器完成用户验证。如果验证成功,则继续执行该函数,否则直接返回False#该类作为装饰器print('----------------------')classDec_obj(object):def__init__(self,func):self._func=funcdef__call__(self,*args,**kwargs):print('deccalled')ifkwargs.get('user')=='mark'andkwargs.get('password')=='wo4xuhao':returnself._func(*args,**kwargs)else:returnFalse@Dec_objdeffunc(*args,**kwargs):print('funcentered')returnsum(args)print(func(2,6,9,user='mark',password='wo4xuhao'))python函数装饰器的分享到此结束,请务必自己写代码!