博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二十九节,装饰器
阅读量:7040 次
发布时间:2019-06-28

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

装饰器简介

装饰器,用于装饰某个函数,或者方法,或者类

装饰可以用于某个函数或者方法或者类在执行之前或者执行后做某些操作,也可以理解为,为某个函数或者方法或者类添加功能
好处:是不用改变原来的函数,就可以给原来的函数添加功能
方法:
1,定义一个函数,里面传一个值用于接收被装饰函数的名称(叫做装饰器函数)
2,在装饰器函数里定义一个函数(叫做装饰器功能函数)来写添加功能和执行被装饰函数
3,在装饰器功能函数return返回被装饰函数给装饰器功能函数,并且在装饰器函数return返回装饰器功能函数给装饰器函数

4,在被装饰函数上面写上 @装饰器函数名 就可以调用执行装饰器函数

重点:只要函数应用上了装饰器,那么函数就会被重新定义,重新定义为装饰器的内层函数,装饰器内层函数的返回结果就等于应用了装饰器的函数结果

#!/usr/bin/env python# -*- coding:utf-8 -*-#装饰器函数def zh(sh): #接收被装饰函数的名称    def zhshi():    #装饰器功能函数        print("在执行被装饰函数前添加功能")        r =  sh()   # 执行装饰器函数接收到的被装饰函数,也就是执行被装饰函数        print("在执行被装饰函数后添加功能")        return r    #将被装饰函数执行的结果返回给装饰器功能函数    return zhshi    #将装饰器功能函数名称返回给装饰器函数@zh     # @zh 的意思是执行装饰器函数,并且将被装饰的函数名,当做参数传给装饰器函数,并且将装饰器函数的返回值重新赋值给被装饰的函数#被装饰函数def f1():    print("f1被装饰函数功能")#执行f1函数f1()# 在执行被装饰函数前添加功能# f1被装饰函数功能# 在执行被装饰函数后添加功能

重点:只要函数应用上了装饰器,那么函数就会被重新定义,重新定义为装饰器的内层函数,装饰器内层函数的返回结果就等于应用了装饰器的函数结果

 

装饰器装饰含两个参数的函数,就是原始的函数有两个形式参数

#!/usr/bin/env python# -*- coding:utf-8 -*-#装饰器函数def zh(sh):     #定义装饰器函数,接收被装饰函数的名称    def zhshi(a1,a2):   #定义装饰器功能函数,接收被装饰函数的形式参数,注意这里的形式参数可以不给被装饰函数的形式参数一样,但个数要一样        print("在执行被装饰函数前添加功能")        r =  sh(a1,a2)  #接收被装饰函数的形式参数并且执行被装饰函数        print("在执行被装饰函数后添加功能")        return r    #将被装饰函数返回结果给,装饰器功能函数    return zhshi    #将装饰器功能函数名称返回给,装饰器函数@zh     #调用执行装饰器#被装饰函数def f1(a1,a2):    a3 = a1 + a2    return a3#执行f1函数s1 = f1(3,5)print(s1)# 最后打印结果# 在执行被装饰函数前添加功能# 在执行被装饰函数后添加功能# 8

重点:只要函数应用上了装饰器,那么函数就会被重新定义,重新定义为装饰器的内层函数,装饰器内层函数的返回结果就等于应用了装饰器的函数结果

 

 

装饰器装饰含N个参数和任意参数的函数(推荐)

 

用(动态参数)一个*元组类型非约束参数名称 *args 和(动态参数)两个**字典类型非约束参数名称 **kwargs ,来实现装饰器装饰任意参数的函数(详情见自定义函数动态参数)

 

动态参数)一个*元组类型*args:可以接受多个单一性的实际参数

动态参数)两个**字典类型非约束参数名称**kwargs:可以接受多个键值性参数
以上结合就可以接受任意参数

#!/usr/bin/env python# -*- coding:utf-8 -*-#装饰器函数def zh(sh):     #定义装饰器函数,接收被装饰函数的名称    def zhshi(*args,**kwargs):   #定义装饰器功能函数,用*args,**kwargs动态参数,接收被装饰函数的形式参数        print("在执行被装饰函数前添加功能")        r =  sh(*args,**kwargs)  #用*args,**kwargs动态参数,接收被装饰函数的形式参数并且执行被装饰函数        print("在执行被装饰函数后添加功能")        return r    #将被装饰函数返回结果给,装饰器功能函数    return zhshi    #将装饰器功能函数名称返回给,装饰器函数@zh     #调用执行装饰器#被装饰函数def f1(a1,a2,a3):    a4 = a1 + a2    print(a4)    return a3#执行f1函数s1 = f1(3,5,"林贵秀")print(s1)# 在执行被装饰函数前添加功能# 8# 在执行被装饰函数后添加功能# 林贵秀

 

 

装饰器之多个装饰器装饰同一个函数(重点)

装饰器之多个装饰器装饰同一个函数,是从被装饰函数最近的一个装饰器调用开始的,依次从下到上的将装饰器内层函数赋值叠加给上一个装饰器,等到达最上层调用装饰器时在一步一步向叠加的函数里面解析,将最后结果返回给最上层调用装饰器在返回给被装饰函数

#!/usr/bin/env python# -*- coding:utf-8 -*-#装饰器之多个装饰器装饰同一个函数,注意注释说明的步骤#装饰器函数1def zh(sh): #第一步将zh装饰器函数放入内存,第五步执行zh装饰器函数    def zhshi(*args,**kwargs):        print("在执行被装饰函数前添加功能")  #打印字符串        r =  sh(*args,**kwargs)     #注意此时的sh函数就是zh2装饰器函数的内层函数zhshi2,也就是执行的zhshi2()函数        print("在执行被装饰函数后添加功能")  #打印字符串        return r    #返回zhshi2函数的返回值    return zhshi#装饰器函数2def zh2(sh):    #第二步将zh2装饰器函数放入内存,第四步将zh2装饰器函数名和它的参数传入zh装饰器函数    def zhshi2(*args,**kwargs):        print("额外增加")        r =  sh(*args,**kwargs)        return r    return zhshi2@zh@zh2    #第三步执行zh2装饰器函数并且把f1函数名和它的参数传入zh2装饰器函数def f1(a1,a2,a3):    a4 = a1 + a2    print(a4)    return a3#执行f1函数s1 = f1(3,5,"林贵秀")print(s1)#打印出# 在执行被装饰函数前添加功能# 额外增加# 8# 在执行被装饰函数后添加功能# 林贵秀

 

 

转载地址:http://jsxal.baihongyu.com/

你可能感兴趣的文章
Go 的 fake-useragent 了解一下
查看>>
创建topic——kafka源码探究之一
查看>>
【Laravel】Laravel 框架关键技术解析·读书笔记(一)
查看>>
ES6入门---let和const
查看>>
Codepen 每日精选(2018-4-10)
查看>>
git学习笔记
查看>>
Thinking——Debian On Windows初试
查看>>
看完你也想编写自己的 react 插件
查看>>
数据结构与算法:常见排序算法
查看>>
记录一次并发读取MongoDB的踩坑过程
查看>>
初识JavaScript EventLoop
查看>>
MVC是什么
查看>>
关于 emotion 初步使用的笔记
查看>>
PHP 怎样在同一个域名下两个不同的项目做独立的登录机制?
查看>>
SpringCloud(第 005 篇)电影微服务,注册到 EurekaServer 中,通过 Http 协议访问用户微服务...
查看>>
k-邻近算法(kNN)
查看>>
gulp基础和常用插件介绍
查看>>
开发之路(设计模式六:命令模式上)
查看>>
JavaScript:并发模型与Event Loop
查看>>
CSS揭秘之《条纹背景》
查看>>