Python的decorator装饰器

  1. 问题:定义了一个函数,想在运行时动态增加功能,但又不想改动函数本身的代码。

示例:希望对下列函数调用增加log功能,打印出函数调用:

    def f1(x):

         return x * 2

    def f2(x):

         return x * x

    def f3(x):

         return x * x * x

 方法1:直接修改原函数

  def f1(x):

         print ('call f1()')

         return x * 2

    def f2(x):

         print ('call f2()')

         return x * x

    def f3(x):

         print ('call f3()')

         return x * x * x

 思考: 有没有更简单的方法?

     ——高阶函数 :可以接收函数作为参数,可以返回函数,那么是否可以接收一个函数,对其包装,然后返回一个新函数?      

方法2 :通过高阶函数返回新函数

def f1(x):

      return x * 2

def new_fn(f):  #装饰器函数

      def fn(x):

             print ('call' + f._name_ + '()')  #函数对象有一个__name__属性,可以拿到函数的名字:

             return f(x)

       return fn

# 调用

(1)  g1 = new_fn(f1)

      print (g1(5))

(2)  f1 = new_fn(f1)

      print (f1(5))  # f1的原始定义函数被彻底隐藏了

 2. Python 内置的@语法就是为了简化装饰器调用:

@new_fn                                                 def f1(x):

def f1(x):                          ===>                      return x * 2

      return x * 2                                        f1 = new_fn(f1)

 3. 装饰器的作用

可以极大地简化代码,避免每个函数编写重复性代码。

打印日志:@log

检测性能:@performance

数据库事物:@transaction

URL路由:@post('/register')

 

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值