博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4.1 装饰器详解
阅读量:6317 次
发布时间:2019-06-22

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

一、装饰器介绍:

定义:本质是函数,作用是为其他函数添加附加功能

原则:【1】不能修改被装饰函数的源代码 【2】不能修改被装饰函数的调用方式

 

二、装饰器实现:

原理:【1】先通过高阶函数实现函数的包装修饰 【2】再通过内嵌函数+被装饰函数的定义变更,实现调用方式的保留

操作:

【第一层函数】通过高阶函数装饰

例:

现有函数

def test():

    print(“test”)

通过高阶函数方式执行test并额外打印“a":

def deco(func):

    func()

    print("a")

这样,执行deco(test)时,就会既执行test又打印了“a“

【第二层函数】通过内嵌函数+定义变更,实现调用方式的保留

如上述操作,若加多一条

test=deco(test)

那么只要执行

test

亦可达到同样的效果,但是test与test()还是有区别的,那么如何用test()来表达test呢?

只要再加一层函数即可:

def more(func):

    def deco():

      func()

      print("a")

    return deco

这时,若加test=more(test),则执行test(),即可达到想要的效果了

且python已经将底部代码包装,在被装饰函数上面写上:@more,即可起到执行前执行test=more(test)命令的效果

【第三层函数】第二层函数其实已经达到了想要的效果,这第三层函数是拓展型函数,可为装饰器本身传递函数,用来增加装饰器的可变性

如上面,在more()函数外再加一层函数more2:

def more2(a):

  def more(func):

      def deco():

        func()

        print("a")

      return deco

  return more

即可在装饰时传递函数,使用方式为:

@more2(a=3)

 

转载于:https://www.cnblogs.com/renhuaIT/p/9518509.html

你可能感兴趣的文章
mysql 的常用命令及常见问题解决方法
查看>>
bat执行sqlplus语句,省去@xx.sql过程
查看>>
Nuget.config格式错误,请检查nuget.config配置文件
查看>>
嵌入式软件工程师面试
查看>>
程序中的异常和错误处理
查看>>
Apache Spark源码走读之1 -- Spark论文阅读笔记
查看>>
关于小乌龟的使用
查看>>
javascript实现保留两位小数的多种方法
查看>>
Google Map Api V3 系列之 导航(包括清除线路)
查看>>
DELPHI中四种EXCEL访问技术实现
查看>>
xmlrpc
查看>>
20145337《Java程序设计》第四周学习总结
查看>>
【leetcode】213. House Robber II
查看>>
关于Netty的一些理解、实践与陷阱
查看>>
如何使用Kubernetes部署Nodejs的Http服务
查看>>
磁盘分区
查看>>
Jrules sample server 配置
查看>>
Git无法使用
查看>>
PHP评分系统
查看>>
hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]...
查看>>