设为首页 收藏本站
查看: 1266|回复: 0

[经验分享] python 3层装饰器及应用场景

[复制链接]

尚未签到

发表于 2018-8-15 06:00:57 | 显示全部楼层 |阅读模式
  #!/usr/bin/env python
  # -*- coding:utf-8 -*-
  # author: Changhua Gong
  import time, functools
  '''
  实现装饰器:
  1.函数即变量;
  2.高阶函数;
  1)把一个函数名当做实参传给另一个函数(在不修改被装饰函数的源代码情况下为其添加功能);
  2)返回值中,包含函数名(不修改函数的调用方试)。
  3.嵌套函数(在一个函数中,用def去声明另一个函数)。
  原则:
  1.不能修改被装饰的函数的源代码;
  2.不能修改被装饰的函数的调用方试。
  补:
  1.函数在调用前,只要其涉及到的变量均在调用前别解释完全(无论先后顺序)
  即可顺利执行。
  '''
  def timmer(func):
  # @functools.wraps(func)  #加上这个装饰后test的函数名就不是wrapper了,而是test,注意位置(http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000)
  def wrapper(*args, **kv):
  time_b = time.time()
  return (func(*args, **kv))
  time_e = time.time()
  print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))
  return wrapper  # 注意这个return的位置
  # 写在装饰的函数的前面,装饰多个函数,每个函数前面需加上@decorator
  @timmer  # test = timmer(test) = wrapper, 调用时test() = wrapper(),这里说明参数的传输问题
  # test(*args,**kv) = wrapper(*args,**kv)
  def test():
  print("Function test begins running.")
  time.sleep(0.2)
  print("Function test ends running.")
  return "测试"
  print("通过2层装饰器函数名更替为:%s" % test.__name__)
  print(test())
  print("-----------------------------------------")
  def timmer(func):
  #@functools.wraps(func)
  def wrapper(*args, **kv):
  time_b = time.time()
  print("Begin calling.")
  rs = func(*args, **kv)  # 将函数返回值赋给rs
  print("End calling.")
  return rs  # 这里返回函数执行完后的返回值
  time_e = time.time()
  print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))
  return wrapper  # 注意这个return的位置
  # 写在装饰的函数的前面,装饰多个函数,每个函数前面需加上@decorator
  @timmer  # test = timmer(test) = wrapper, 调用时test() = wrapper(),这里说明参数的传输问题
  # test(*args,**kv) = wrapper(*args,**kv)
  def test():
  print("Function test begins running.")
  time.sleep(0.2)
  print("Function test ends running.")
  return "测试"
  print("通过2层装饰器函数名更替为:%s" % test.__name__)
  print(test())
  print("-----------------------------------------")
  '''
  上述装饰器都是简单的两层。
  如果装饰器本身需要传入参数,则需要3层(应用场景如:登录网页使用微信、QQ、还是邮箱)。
  '''
  def login(login_type):
  def timmer(func):
  #@functools.wraps(func)
  def wrapper(*args, **kv):
  time_b = time.time()
  if login_type == "QQ":
  print("Login by QQ.")
  return (func(*args, **kv))
  else:
  print("Login by Others.")
  return (func(*args, **kv))
  time_e = time.time()
  print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))
  return wrapper  # 注意这个return的位置
  return timmer # 注意这个return的位置
  # 写在装饰的函数的前面,装饰多个函数,每个函数前面需加上@decorator
  @login("QQ")  # test = timmer(test) = wrapper, 调用时test() = wrapper(),这里说明参数的传输问题
  # test(*args,**kv) = wrapper(*args,**kv)
  def test():
  print("Function test begins running.")
  time.sleep(0.2)
  print("Function test ends running.")
  return "测试"
  print("通过3层装饰器函数名更替为:%s" % test.__name__)
  print(test())

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-551840-1-1.html 上篇帖子: Mac OS 10.12下安装Mysql-python问题 下篇帖子: python版冒泡排序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表