第二十九节,装饰器

 

第二十九节,装饰器

装饰器简介

装饰器,用于装饰某个函数,或者方法,或者类
装饰可以用于某个函数或者方法或者类在执行之前或者执行后做某些操作,也可以理解为,为某个函数或者方法或者类添加功能
好处:是不用改变原来的函数,就可以给原来的函数添加功能
方法:
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
# 在执行被装饰函数后添加功能
# 林贵秀

 

posted @ 2018-10-29 11:21  zhuntidaoren  阅读(193)  评论(0编辑  收藏  举报