Python装饰器

介绍

对函数进行扩展,增加额外的功能

  • 开放封闭原则:

    开放:对拓展功能是开放的

    封闭:对修改源代码是封闭的

函数装饰器

点击查看代码
from functools import wraps def decorate(func): @wraps(func) def wrapper(*args, **kwargs): print('wrapper...') ... return func(*args, **kwargs) return wrapper @decorate def demo(): return sum([i**2 for i in range(10)]) print(demo())

携带参数

点击查看代码
from functools import wraps def test(v='test'): print('outer: ', v) def decorate(func): @wraps(func) def wrapper(*args, **kwargs): print('wrapper...') print('inner: ', v) ... return func(*args, **kwargs) return wrapper return decorate @test('demo') def demo(): return sum([i**2 for i in range(10)]) print(demo())

类装饰器

使用类作为装饰器来装饰函数或其他可调用对象。在类装饰器中,装饰逻辑通常被包装在类的 __init____call__ 方法中。

点击查看代码
class MyDecorator: def __init__(self, func): # 在装饰器被创建时调用 self.func = func print('init') def __call__(self, *args, **kwargs): # 在被装饰的函数被调用时调用。 print('wrapper...') result = self.func(*args, **kwargs) return result @MyDecorator # 调用 __init__ def demo(x, y): return x + y res = demo(2, 3) # 调用 __call__ print("Result:", res)

携带参数

点击查看代码
class MyDecorator: def __init__(self, arg1, arg2): self.arg1 = arg1 self.arg2 = arg2 print('init') def __call__(self, func): def wrapper(*args, **kwargs): print('wrapper') result = func(*args, **kwargs) return result return wrapper @MyDecorator("Hello", 123) def demo(x, y): return x + y res = demo(2, 3) print("Result:", res)

类方法装饰器

将类方法以装饰器进行使用,如:路由注册

点击查看代码
from typing import Callable class Obj: def __init__(self, name='Obj'): self.name = name self.all_func = [] def __decorator(self, method: str, **options): def wrapper(func): print('wrapper') self.all_func.append(func.__name__) print(f'{self.name} [{method}]') def action(*args, **kwargs): print('action...') return func(*args, **kwargs) return action return wrapper def get(self, **options) -> Callable: return self.__decorator('GET', **options) def post(self, **options) -> Callable: return self.__decorator('POST', **options) obj = Obj() @obj.get() def test_get(data='get'): return data @obj.post() def test_post(data='post'): return data print(obj.all_func) print(test_get()) print(test_post())

__EOF__

本文作者F___Q
本文链接https://www.cnblogs.com/FevolQ/p/17571216.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   F___Q  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示