|
发表于 2025-4-23 00:22:22
|
显示全部楼层
本楼为最佳答案
本帖最后由 jackz007 于 2025-4-23 01:15 编辑
本例的装饰器带有参数,装饰器函数必须要设计成 3 层嵌套的形式,才能匹配 Python 对装饰器函数的调用方式。
- def wrapper(n) :
- def outer(func) :
- def inner() :
- for i in range(n) :
- print(' ' * (n - i - 1) + '*' * (i * 2 + 1))
- func()
- for i in range(n , 0 , -1) :
- print(' ' * (n - i) + '*' * (i * 2 - 1))
- return inner
- return outer
- @wrapper(7)
- def diamond() :
- print('DIAMOND LIGHT')
- diamond()
复制代码
运行实况:
- D:\[00.Exercise]\[Python]>python x.py
- *
- ***
- *****
- *******
- *********
- ***********
- *************
- DIAMOND LIGHT
- *************
- ***********
- *********
- *******
- *****
- ***
- *
- D:\[00.Exercise]\[Python]>
复制代码
其实,Python 是这样调用装饰器各个相关函数的:
- def wrapper(n) :
- def outer(func) :
- def inner() :
- for i in range(n) :
- print(' ' * (n - i - 1) + '*' * (i * 2 + 1))
- func()
- for i in range(n , 0 , -1) :
- print(' ' * (n - i) + '*' * (i * 2 - 1))
- return inner
- return outer
- def diamond() :
- print('DIAMOND LIGHT')
- wrapper(7)(diamond)() # Python 对装饰器的实际调用逻辑
复制代码
楼主的代码不用装饰器的等效代码为:
- def diamond(n) :
- def abc(func) :
- for i in range(n) :
- print(' ' * (n - i - 1) + '*' * (i * 2 + 1))
- func()
- for i in range(n , 0 , -1) :
- print(' ' * (n - i) + '*' * (i * 2 - 1))
- return abc
- def DL() :
- print('DIAMOND LIGHT')
- diamond(7)(DL)() # Python 对装饰器的实际调用逻辑
复制代码
|
|