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())
posted @ 2023-07-21 14:09  F___Q  阅读(5)  评论(0)    收藏  举报