多层装饰的两种形式
使用装饰器实现如下所示的打印:
===============
***************
小白联盟
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。