python装饰器——装饰器工厂函数

多层装饰的两种形式

使用装饰器实现如下所示的打印:

===============
***************
小白联盟

1、两个装饰器:

def printequel(func1):
    def inner1():
        print('='*15)
        func1()
    return inner1


def printstar(func2):
    def inner2():
        print('*'*15)
        func2()
    return inner2


@printequel
@printstar
def myprint():
    print("小白联盟")


myprint()

执行逻辑:
①myprint = printequel(printstar(mystyle))
该步首先相当于是赋值
1)将printequel函数赋值给myprint
2)由于printequel函数的参数func1未知,需先寻找其参数,为函数printstar
3)函数printstar的参数func2 = myprint,已知,则执行printstar函数以得到func1,执行后func1 = inner2
4)知道printequel的参数func1 = inner2后执行printequel,返回inner1,此返回值赋值给myprint
5)执行②
②myprint() #执行该函数
myprint = inner1
1)执行inner1,func1为inner2,inner2中的func2为myprint函数
2)执行结束

2、装饰器工厂函数:

def get_celebrator(char):
    def print_style(func):
        def inner():
            print(char*15)
            func()
        return inner
    return print_style


@get_celebrator('=')
@get_celebrator('*')
def myprint():
    print("小白联盟")


myprint()

执行逻辑:
1)首先执行get_celebrator(’=’),执行完后返回print_style,为了区分就叫做print_style1;
2)执行@1的装饰,由于装饰需要func参数,未知,故向下寻找func;
3)执行get_celebrator(“ * ”),返回print_style,称为print_style2;
4)执行完3)返回的是一个装饰器,故执行@2的装饰,即执行称为print_style2,返回inner2,此参数为myprint;
5)2)中装饰为完成,现知道func参数,故继续装饰@1,返回inner1,此参数为inner2;
6)将inner1赋值给myprint后,执行myprint();
7)执行myprint()即执行inner1。先打印‘=’,后执行func函数即inner2,执行inner2先打印‘*’后执行func函数即myprint。
8)执行完毕,over。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值