首页 > 编程知识 正文

python中装饰器,装饰的基本原理

时间:2023-05-04 00:13:16 阅读:143725 作者:2181

我们在定义装饰器时,会在用@wraps装饰的函数中保持自己的私有属性

defdecorator(f ) : @wraps(f ) f ) defdecorated ) args,**kwargs (: print ) ok ' ) returnf ) args,* * kwargs

wrapper _ assignments=(' _ _ module _ ',' __name__ ',' __qualname__ ',' __doc___ ',) toawrapperfunctionreturnsadecoratorthatinvokesupdate _ wrapper nts.defaultargumentsareasforupdate _ wrapper (.thisisaconveniencefunctiontosimplifyapplyingpartial o update _ wrapper (. wrapped=wrapped,assigned=assigned,updated=updated wrapped=wrapped assigned=assigned,updated=updated ),其中parad partial(update_wrapper,wrapped=updated=updated (3http://www.Sina.com/)和update_wrapper ) 3358www.Sina.com/

defupdate_wrapper(wrapper,wrapped,assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES ) 3360 " ' updateawrapperfunctiontolooklikethewrappedfunctionwrapperisthefunctiontobeupdatedwrappedistheoriginalfunctionasigng signeddirectlyfromthewrappedfunctiontothewrapperfunction (defaultstofunctools.wrapper _ asign mment updatedisatuplenamingthet datedwiththecorrespondingattributefromthewrappedfunction (ols.wrapper _ updates (' ' forattrinassigned 3360 try 3360 value=value attr ) exceptattributeerror 3360 pat alue attr,value (forattrinupdated : getattr (wrapper,attr ).update ) getattr ) wrapat { } ) # issue # 174823360 set _ _ wrapped _ _ lastsowedon ' tinadvertentlycopyit # fromthewrappedfunctionwhenupdating _ ting

update_wrapper(wrapper,f,assigned=((__module_ ),(__name__ ),) ____qualname_ ),) _。

defdecorator(f ) :@update_wrapper,f,assigned=((__module__ ),(__name__ ),) _。 udated='_dict__ ',) defdecorated(args,**kwargs ) :print ) ok ) returnf ) args,**kwargs

defdecorator(f ) :update_wrapper ) decorated,f,assigned=((__module__ ),(__name__ ),) _。 updated=('__dict__ ',) (请参阅上面的update_wrapper实现,可以看到将f的属性绑定到decorated。 这是因为在使用装饰器时:

@ decoratordeflogin (: return ' hello )是

可以看到login=decorator(login )=decorated装饰器修饰的函数login为函数decorated。 如上所示,您可以看到@wraps的存在将函数login )的属性绑定到了decorated

如果在定义装饰器时不使用@wraps

# fromfunctoolsimportwrapsdefdecorator (f ) :# @wraps(f ) f ) defdecorated ) args、 **kwargs ) : print (“ok”) ) ) ) ) * kwargs (return decorated @ decoratordeftest ) ) : return ' ok ' preftest )

function

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。