Pythonのデコレータの解説

def fn():
    print(f'fn函数被执行')
    return 0


def fn1(a):
    print(f'fn1函数被执行:a={
      
      a}')
    return a


def fn2(a, b):
    print(f'fn2函数被执行:a={
      
      a},b={
      
      b}')
    return a + b


def fn3(a, b, c=1):
    print(f'fn3函数被执行:a={
      
      a},b={
      
      b},c={
      
      c}')
    return a + b + c

デコレータ関数

def begin_end(old):
    '''
        用来对其他函数进行扩展,使其他函数可以在执行前打印开始执行,执行后打印执行结束
        :param old: 要扩展的函数对象
        :return:
    '''

    # 创建一个新函数
    def new_function(*args, **kwargs):
        '''
        :param args: 用来接收位置参数,存到元组中
        :param kwargs: 用来接收关键字参数,存到字典中
        :return:
        '''
        print('开始执行~~~~')
        # 调用被扩展的函数
        result = old(*args, **kwargs)  # 这里的*args,将元组解包,使元素赋值给位置形参。**kwargs,将字典解包,使元素赋值给关键字形参
        print('执行结束~~~~')
        return result

    # 返回新函数
    return new_function

通話テスト

# f = begin_end(fn1)
# print(f)
# f = begin_end(fn1)
# print(f)
# 上述打印的两个f的地址是不一样的,说明每次返回的都是一个新函数对象

# 第一种使用装饰器函数的方式,这种不常用
# f = begin_end(fn)
# print(f())
# f = begin_end(fn1)
# print(f(1))
# f = begin_end(fn2)
# print(f(1, 2))
# f = begin_end(fn3)
# print(f(1, 2, 3))

# 第二种使用装饰器函数的方式
# 加这个注解的作用等同上面的先调begin_end,然后再执行返回的函数对象
@begin_end
def fn4(a, b):
    print("执行fn4函数~~~~~")
    return a + b


print(fn4(3, 5))  # 等同于执行了print(new_function(3,5))

像 begin_end()这种函数我们就称它为装饰器
通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
在开发中,我们都是通过装饰器来扩展函数的功能的
在定义函数时,可以通过@装饰器,来使用指定的装饰器,来装饰当前的函数
可以同时为一个函数指定多个装饰器,这样函数将会按照从内向外的顺序被装饰

# 再定义一个装饰器
def fn5(old):
    '''
        用来对其他函数进行扩展,使其他函数可以在执行前打印开始执行,执行后打印执行结束
        :param old: 要扩展的函数对象
        :return:
    '''

    # 创建一个新函数
    def new_function(*args, **kwargs):
        '''
        :param args: 用来接收位置参数,存到元组中
        :param kwargs: 用来接收关键字参数,存到字典中
        :return:
        '''
        print('fn5 装饰 开始执行~~~~')
        # 调用被扩展的函数
        result = old(*args, **kwargs)  # 这里的*args,将元组解包,使元素赋值给位置形参。**kwargs,将字典解包,使元素赋值给关键字形参
        print('fn5 装饰 执行结束~~~~')
        return result

    # 返回新函数
    return new_function

通話テスト

@fn5
@begin_end
def say_hello():
    print('大家好~~~')


say_hello()

の結果

fn5 装饰 开始执行~~~~
开始执行~~~~
大家好~~~
执行结束~~~~
fn5 装饰 执行结束~~~~

2 つの @ デコレータの位置を置き換えます

@begin_end
@fn5
def say_hello():
    print('大家好~~~')


say_hello()

の結果

开始执行~~~~
fn5 装饰 开始执行~~~~
大家好~~~
fn5 装饰 执行结束~~~~
执行结束~~~~

说明:可以同时为一个函数指定多个装饰器,这样函数将会按照从内向外的顺序被装饰

おすすめ

転載: blog.csdn.net/adminstate/article/details/131143135