由浅入深,走进Python装饰器-----第二篇:进阶--函

上一篇:由浅入深,走进Python装饰器-----第一篇:基础

目前成都创新互联已为上千的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器托管、企业网站设计、义安网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。



装饰器的使用种类:

# 第一种
@函数
   被装饰函数

# 第二种
@函数
    被装饰类

# 第三种
@类
    被装饰类

# 第四种
@函数
   被装饰函数


本篇介绍第一种

@函数
   被装饰函数

1.1 对带参数的原函数进行修饰

# 默认将old函数的参数传给outer里面的第一层函数
def outer(f):
    def inner(var):
        print("1 我是outer函数,接收外部传进来的old :",f)
        print("1 我是outer函数,接收外部传进来的old的参数 :",var)
        f(var)
        print("3 我是outer函数,我在old函数后显示")
    return inner
    def inner2(var):
        pass
@outer                                     #old = outer(old)
def old(var):
    print("2 我是old函数","参数: ",var)

var = '音乐'                                                
old(var)

>>>1 我是outer函数,接收外部传进来的old :       <function old at 0x00000000024DAA60>
>>>1 我是outer函数,接收外部传进来的old的参数 : 音乐
>>>2 我是old函数, 参数:音乐
>>>3 我是outer函数,我在old函数后显示

1.2 对多参数的原函数进行修饰

def outer(f):
    def inner(a, b,*args,d,**kwargs):
        tmp = d                                            #通过变量接收命名关键字参数传进来的参数,然后再传递给内部调用的函数                          
        print("1 我是outer函数,接收外部传进来的old :",f)
        print("1 我是outer函数,接收外部传进来的old的参数 :\
            普通参数a={}, 默认参数b={}, 多余的普通参数:{}和{}".format(a,b,args[0],args[1]))
        print("1 我是outer函数,接收外部传进来的old的参数 :\
            命令关键字参数d:{}, 多余的关键字参数:{}和{}".format(d,kwargs["key1"],kwargs["key2"]))
        f(a,b, *args,d = tmp,**kwargs)
        print("3 我是outer函数,我在old函数后显示")
    return inner

@outer                                     #old = outer(old)
def old(a, b=2, *args,d,**kwargs):         #五种参数
    print("2 我是old函数",
        "普通参数a={0}, 默认参数b={1}, 多余的普通参数:{2}和{3},\
        命令关键字参数d:{4}, 多余的关键字参数:{5}和{6}"\
        .format(a,b,args[0],args[1],d,kwargs["key1"],kwargs["key2"]))

dict1 = {"key1":"value1","key2":"value2"}
old(1,22,'args1','args2',d=4,**dict1)

>>> 1 我是outer函数,接收外部传进来的old :        <function old at 0x00000000024AAAE8>
>>> 1 我是outer函数,接收外部传进来的old的参数 :  普通参数a=1, 默认参数b=22, 多余的普通参数:args1和args2
>>> 1 我是outer函数,接收外部传进来的old的参数 :  命名关键字参数d:4, 多余的关键字参数:value1和value2
>>> 2 我是old函数 普通参数a=1, 默认参数b=22, 多余的普通参数:args1和args2,命名关键字参数d:4, 多余的关键字参数:value1和value2
>>> 3 我是outer函数,我在old函数后显示

1.3 对多参数的原函数进行嵌套修饰

def outer(f):
    def inner(a, b,*args,d,**kwargs):
        tmp = d                                            #通过变量接收命名关键字参数传进来的参数,然后再传递给内部调用的函数                          
        print("1 我是outer函数,接收外部传进来的old :",f)
        print("1 我是outer函数,接收外部传进来的old的参数 :\
            普通参数a={}, 默认参数b={}, 多余的普通参数:{}和{}".format(a,b,args[0],args[1]))
        print("1 我是outer函数,接收外部传进来的old的参数 :\
            命令关键字参数d:{}, 多余的关键字参数:{}和{}".format(d,kwargs["key1"],kwargs["key2"]))
        f(a,b, *args,d = tmp,**kwargs)
        print("3 我是outer函数,我在old函数后显示")
    return inner

@outer                         #old = outer(outer(old))
@outer                         #old = outer(old)
def old(a, b=2, *args,d,**kwargs):         #五种参数
    print("2 我是old函数",
        "普通参数a={0}, 默认参数b={1}, 多余的普通参数:{2}和{3},\
        命令关键字参数d:{4}, 多余的关键字参数:{5}和{6}"\
        .format(a,b,args[0],args[1],d,kwargs["key1"],kwargs["key2"]))

dict1 = {"key1":"value1","key2":"value2"}
old(1,22,'args1','args2',d=4,**dict1)

>>> 1 我是outer函数,接收外部传进来的old :         <function outer.<locals>.inner at 0x00000000024FAAE8>
>>> 1 我是outer函数,接收外部传进来的old的参数 :   普通参数a=1,  默认参数b=22,  多余的普通参数:args1和args2
>>> 1 我是outer函数,接收外部传进来的old的参数 :   命令关键字参数d:4,  多余的关键字参数:value1和value2
>>> 1 我是outer函数,接收外部传进来的old :         <function old at 0x00000000024FAA60>
>>> 1 我是outer函数,接收外部传进来的old的参数 :   普通参数a=1, 默认参数b=22, 多余的普通参数:args1和args2
>>> 1 我是outer函数,接收外部传进来的old的参数 :   命令关键字参数d:4, 多余的关键字参数:value1和value2
>>> 2 我是old函数 普通参数a=1, 默认参数b=22, 多余的普通参数:args1和args2,命令关键字参数d:4, 多余的关键字参数:value1和value2
>>> 3 我是outer函数,我在old函数后显示
>>> 3 我是outer函数,我在old函数后显示

1.4 用带参数的装饰器函数 对 无参数原函数 进行修饰

def kuozhan(can_shu):
    def outer(f):
        tmp = can_shu
        def inner1():
            print("1 我是outer函数里的inner1,接收外部传进来的old :",f)
            f()
            print("3 我是outer函数里的inner1,我在old函数后显示")

        def inner2():
            print("1 我是outer函数里的inner2,接收外部传进来的old :",f)
            f()
            print("3 我是outer函数里的inner2,我在old函数后显示")
        if tmp == 1:
            return inner1
        else:
            return inner2

@kuozhan(2)                          # old = kuozhan(2)(old)    ==>      old = outer(old)
def old():
    print("2 我是old函数")

old()

>>> 1 我是outer函数里的inner2,接收外部传进来的old : <function old at 0x0000000001E8ABF8>
>>> 2 我是old函数
>>> 3 我是outer函数里的inner2,我在old函数后显示

1.5用带参数的装饰器函数 对 有参数原函数 进行修饰

def kuozhan(can_shu):
    def outer(f):
        tmp = can_shu
        def inner1(var):
            print("1 我是outer函数里的inner1,接收外部传进来的old :",f)
            print("1  我是outer函数里的inner1,接收外部传进来的old的参数 :",var)
            f(var)
            print("3 我是outer函数里的inner1,我在old函数后显示")

        def inner2(var):
            print("1 我是outer函数里的inner2,接收外部传进来的old :",f)
            print("1  我是outer函数里的inner2,接收外部传进来的old的参数 :",var)
            f(var)
            print("3 我是outer函数里的inner2,我在old函数后显示")
        if tmp == 1:
            return inner1
        else:
            return inner2
    return outer

@kuozhan(2)                         # old = kuozhan(2)(old)    ==>      old = outer(old)
def old(var):
    print("2 我是old函数,","我的参数是: ",var)
var = "音乐"                                              
old(var)

>>> 1 我是outer函数里的inner2,接收外部传进来的old :        <function old at 0x00000000021CABF8>
>>> 1 我是outer函数里的inner2,接收外部传进来的old的参数 :  音乐
>>> 2 我是old函数,      我的参数是:  音乐
>>> 3 我是outer函数里的inner2,我在old函数后显示

1.6 对类内部的方法进行修饰

# 默认将old函数的参数传给outer里面的第一层函数
def outer(f):
    def inner(var):
        print("1 我是outer函数,接收外部传进来的old :",f)
        print("1 我是outer函数,接收外部传进来的old的参数 :",var)
        f(var)
        print("3 我是outer函数,我在old函数后显示")
    return inner
    def inner2(var):
        pass
class MyClass():
    @outer                                     #old = outer(old)
    def old(var):
        print("2 我是old函数","参数: ",var)

var = '音乐'                                                
MyClass.old(var)

>>>1 我是outer函数,接收外部传进来的old :       <function old at 0x00000000024DAA60>
>>>1 我是outer函数,接收外部传进来的old的参数 : 音乐
>>>2 我是old函数, 参数:音乐
>>>3 我是outer函数,我在old函数后显示

当前题目:由浅入深,走进Python装饰器-----第二篇:进阶--函
分享链接:https://www.cdcxhl.com/article46/jscehg.html

成都网站建设公司_创新互联,为您提供动态网站营销型网站建设服务器托管软件开发全网营销推广用户体验

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

外贸网站建设