Python 以类作为装饰器 几种使用场景
1. 原函数、装饰器 都 没有参数
代码:
class Test:
def __init__(self, func):
print('Be in __init__ process...')
self.__func = func
def __call__(self):
print("...Start decorate...")
self.__func()
print("...After decorate...")
@Test
def func1(): # 相当于 func1 = Test(func) ,先新建一个Test对象,执行__init__方法,保存原始func1函数引用到对象
print("this is a func1")
# 现在func1指向一个Test对象
func1() # Test.__call__
2. 原函数 没有参数 、装饰器 有参数
代码:
class Test2:
def __init__(self, num):
print('__init__')
self.__num = num
def __call__(self, f):
print(f"__call__ , num = {self.__num}")
self.__func = f
return self.old_func
def old_func(self):
print("...Start decorate...")
self.__func()
print("...After decorate...")
# Test2(123)的返回值(一个实例对象)对func2进行装饰
@Test2(123) # obj = Test2(123) 、func2 = obj(func2) 后者会执行__call__函数,现在func2指向一个Test2对象中的old_func引用
def func2():
print("this is a func2")
func2()
如果注释掉上面代码最后一行,会有如下输出:
3. 原函数 有参数 、装饰器 没有参数
代码:
class Test3:
def __init__(self, f):
print("__init__")
self.__func = f
def __call__(self, *args, **kwargs):
print("__call__")
print("Start decorating")
self.__func(*args, **kwargs)
print("After decorating")
@Test3
def func3(name):
print(f"this is a {name}")
func3("詹姆斯")
4. 原函数 、装饰器 都有参数
class Test4:
def __init__(self, LEVEL):
print('In __init__')
self.__LEVEL = LEVEL
def __call__(self, f):
print(f"In __call__ , LEVEL = {self.__LEVEL}")
def wrapper(*args, **kwargs):
print("...Start decorate...")
return f(*args, **kwargs)
return wrapper
@Test4(LEVEL = 'Warning')
def func4(name):
print(f"this is a {name}")
func4("wybbb")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律