我们在定义装饰器时,会在用@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