Loading... ###前言 带参装饰器基于无参装饰器,比无参装饰器复杂,主要难点在于如何理清整个装饰器如何运作的。 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://blog.beijixs.cn/archives/600/" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://blog.beijixs.cn/usr/themes/handsome/assets/img/sj/6.jpg);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">装饰器</p> <div class="inster-summary text-muted"> Python装饰器装饰器的主要作用就是装饰,可以避免功能函数中出现侵入式代码,降低部分函数的耦合度的同时提高函数的... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> ###示例 def logger(fn): """ 接受一个函数对象,返回一个函数对象 """ def _logger(*args, **kwargs): print("Function {} Start...".format(fn.__name__)) # 打印函数开始执行日志 ret = fn(*args, **kwargs) # 开始执行函数 # 注意这里是执行fn print("Function {} End.".format(fn.__name__)) # 函数结束 return ret # 返回函数执行后的结果 # 此处不管原函数是否返回最好return一下,哪怕就只有一个None @logger # 该操作等价于 add = logger(add) def add(x, y): return x + y # 调用函数 sum = add(4 , 5) <div class="tip inlineBlock error"> 这是一个无参装饰器,存在一个弊端就是被装饰的函数的属性在装饰后发生改变,此时我们可以用一个有参装饰器解决这以缺陷 </div> def copy(src): """ 接受一个源函数,返回一个目标函数 """ def _copy(dst): dst.__name__ = src.__name__ dst.__doc__ = src.__doc__ # 修改目标函数的属性,然后返回一个目标函数 return dst return _copy def logger(fn): """ 接受一个函数对象,返回一个函数对象 """ @copy(fn) # copy(fn)的执行结果为 => _copy(是一个函数对象) # @copy(fn) <==> @_copy ==> _logger = _copy(_logger) # 装饰_logger函数,返回一个新函数(_logger) def _logger(*args, **kwargs): print("Function {} Start...".format(fn.__name__)) # 打印函数开始执行日志 ret = fn(*args, **kwargs) # 开始执行函数 # 注意这里是执行fn print("Function {} End.".format(fn.__name__)) # 函数结束 return ret # 返回函数执行后的结果 # 此处不管原函数是否返回最好return一下,哪怕就只有一个None @logger # 该操作等价于 add = logger(add) def add(x, y): """ 两个数加法函数 :param x: 第一个数 :param y: 第二个数 :return: x+y """ return x + y # 调用函数 sum = add(4 , 5) print(add(4,5), add.__doc__,sep='\n') # 结果如下 # 9 # 两个数加法函数 # :param x: 第一个数 # :param y: 第二个数 # :return: x+y 最后修改:2020 年 06 月 10 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏
2 条评论
你的才华让人惊叹,你是我的榜样。 https://www.4006400989.com/qyvideo/65338.html
《张卫国的夏天》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/42190.html