博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python装饰器学习
阅读量:6934 次
发布时间:2019-06-27

本文共 3295 字,大约阅读时间需要 10 分钟。

hot3.png

python 装饰器详解

###1. 概述

  • 装饰器是一个很著名的设计模式, 经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。
  • 装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。
  • 概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

###2. demo详解

  • ftime 以函数的形式定义装饰器,不支持参数
  • ftimeParam 以函数的形式定义装饰器,支持装饰器参数
  • Fuctime 以类的形式定义装饰器,不支持参数
  • FuctimeParam 以类的形式定义装饰器,支持装饰器参数
  • 主要关注如下:
    • print add1(1, 2, 3), ftimeParam(1, 3)(add)(1, 2, 3)

    • print add2(1, 2, 3), ftime(add)(1, 2, 3)

    • print add3(1, 2, 3), Fuctime(add)(1, 2, 3)

    • print add4(1, 2, 3), FuctimeParam(1, 2)(add)(1, 2, 3)

      #!/usr/bin/python  # -*- coding: utf-8 -*-  import functools  import time  def ftime(func):      '''          以函数的形式定义装饰器,不支持参数      '''      func.original_func = func      @functools.wraps(func)      def wrapper(*args, **kwargs):          t = time.clock()          result = func(*args, **kwargs)          wrapper.fcostime = time.clock() - t          return result      return wrapper  def ftimeParam(*args, **kwargs):      '''          以函数的形式定义装饰器,支持装饰器参数      '''      def decorator(func):          func.original_func = func          @functools.wraps(func)          def wrapper(*args, **kwargs):              t = time.clock()              result = func(*args, **kwargs)              wrapper.fcostime = time.clock() - t              return result          return wrapper      return decorator  class Fuctime(object):      """以类的形式定义装饰器,不支持参数"""      def __init__(self, func):          super(Fuctime, self).__init__()          self.original_func = func      def __call__(self, *args, **kwargs):          t = time.clock()          result = self.original_func(*args, **kwargs)          self.fcostime = time.clock() - t          return result  class FuctimeParam(object):      """以类的形式定义装饰器,支持装饰器参数"""      def __init__(self, *args, **kwargs):          super(FuctimeParam, self).__init__()          self.args = args          self.kwargs = kwargs      def __call__(self, func):          func.original_func = func          @functools.wraps(func)          def wrapper(*args, **kwargs):              t = time.clock()              result = func(*args, **kwargs)              wrapper.fcostime = time.clock() - t              return result          return wrapper  @ftimeParam(1, 3)  def add1(a, b, c=10, d=15):      '''          add a+b+c+d      '''      return a + b + c + d  @ftime  def add2(a, b, c=10, d=15):      '''          add a+b+c+d      '''      return a + b + c + d  @Fuctime  def add3(a, b, c=10, d=15):      '''          add a+b+c+d      '''      return a + b + c + d  @FuctimeParam(1, 2)  def add4(a, b, c=10, d=15):      '''          add a+b+c+d      '''      return a + b + c + d  def add(a, b, c=10, d=15):      '''          add a+b+c+d      '''      return a + b + c + d  print add1, add1.original_func, add1.original_func(1, 2, 3), add1(1, 2, 3)  print add2, add2.original_func, add1.original_func(1, 2, 3), add2(1, 2, 3)  print add3, add3.original_func, add1.original_func(1, 2, 3), add3(1, 2, 3)  print add4, add4.original_func, add1.original_func(1, 2, 3), add4(1, 2, 3)  print add1.fcostime  print add2.fcostime  print add3.fcostime  print add4.fcostime  print add1(1, 2, 3), ftimeParam(1, 3)(add)(1, 2, 3)  print add2(1, 2, 3), ftime(add)(1, 2, 3)  print add3(1, 2, 3), Fuctime(add)(1, 2, 3)  print add4(1, 2, 3), FuctimeParam(1, 2)(add)(1, 2, 3)

转载于:https://my.oschina.net/dragondjf/blog/169846

你可能感兴趣的文章
perl连接mysql的例子
查看>>
windows server 2008虚拟化技术一览
查看>>
webpack2 实践
查看>>
Linux系统日志介绍分析
查看>>
Linux下Tomcat的启动、关闭、杀死进程
查看>>
FTP服务器的防火墙通用设置规则
查看>>
简单记事本及目录树形图的Java实现
查看>>
android 在使用ViewAnimationUtils.createCircularReveal()无法兼容低版本的情况下,另行实现圆形scale动画...
查看>>
Application Virtualization 4.5 部署之(一)
查看>>
获取ip地址解析归属地
查看>>
启用日志调试Kerberos登录验证问题
查看>>
saltstack二次开发构建自己的api
查看>>
动手打造自己强大的右键菜单
查看>>
探测调试器
查看>>
图案研究2--九格定义
查看>>
通过串口关闭Linux服务器
查看>>
RHEL 5服务篇—使用Apache搭建web服务(四)部署AWStats网站分析系统
查看>>
SQL Serer闩锁 和 闩锁超时故障排除
查看>>
Logparser 分析 Exchange 日志文件
查看>>
KDE与GNOME的起源与发展
查看>>