python装饰器

参考:https://www.bilibili.com/video/BV1DW4y147Hm/

感觉很久没有学到python的一些新玩法了,参考B站教程

在 Python 中,装饰器(Decorator)是一种用于修改函数或者类的行为的语法结构。
装饰器允许我们在不修改函数定义的情况下,动态地修改函数的行为,从而实现更加灵活和可重用的代码。

装饰器本质上就是一个函数,它接收一个函数作为参数,并返回一个新的函数。在装饰器中,可以对原始函数进行各种操作,并返回修改后的函数。

作为一个函数时

def mydecorator(function): //接收一个函数
    def wrapped(*args, **kwargs): //*args,**kwargs 接收任何参数
        # 在调⽤原始函数之前,做点什么
        print("Welcome")
        result = function(*args, **kwargs) 调用函数
        # 在函数调⽤之后,做点什么,
        # 并返回结果
        return result
    # 返回wrapper作为装饰函数
    return wrapped

@mydecorator
def my_fun(message: str):
    print(f"Hello {message}")


my_fun("li_bai")

但是

print(my_fun.__name__) 
wrapped
此时函数已经失去了原始的名称

此时使用functools内置的wraps()装饰器

from functools import wraps

def mydecorator(function):
    @wraps(function)
    def wrapped(*args, **kwargs):
        # 在调⽤原始函数之前,做点什么
        print("Welcome")
        result = function(*args, **kwargs)
        # 在函数调⽤之后,做点什么
        # 并返回结果
        return result

    # 返回wrapper作为装饰函数
    return wrapped

@mydecorator
def my_fun(message: str):
    print(f"Hello {message}")

print(my_fun.__name__)

当使用的装饰器需要传入参数时

from functools import wraps


def welcome(name):
    def mydecorator(function):
        @wraps(function)
        def wrapped(*args, **kwargs):
            # 在调⽤原始函数之前,做点什么
            print(f"Welcome {name}")
            result = function(*args, **kwargs)
            # 在函数调⽤之后,做点什么,
            # 并返回结果
            return result

        # 返回wrapper作为装饰函数
        return wrapped

    return mydecorator


@welcome("wangwei")
def my_fun(message: str):
    print(f"Hello {message}")


my_fun("lihua")

作为一个类

参考Python高级编程(第2版)

class DecoratorAsClass:
    def __init__(self, function):
        self.function = function

    def __call__(self, *args, **kwargs):
        # 在调⽤原始函数之前,做点什么
        print("Welcome")
        result = self.function(*args, **kwargs)
        # 在调⽤函数之后,做点什么,
        # 并返回结果
        return result


def my_fun(message: str):
    print(f"Hello {message}")


p = DecoratorAsClass(my_fun)

p("喜羊羊")

posted @ 2023-04-07 22:20  gvpn  阅读(47)  评论(0编辑  收藏  举报