请稍候,加载中....

函数装饰器

函数装饰器是 Python 中一种用来修改、包装函数行为的高级技术。它实际上是一个可调用对象(函数、类或方法),用来接收一个函数作为参数,并返回一个新的函数作为结果。函数装饰器通常以 `@decorator_function` 的语法形式使用,放在函数定义前面。

在函数装饰器中,您可以在不修改原始函数代码的情况下,向其添加额外的功能、行为或逻辑。这种技术使得代码更加简洁和易于维护,同时也提供了一种灵活的方式来扩展函数的功能。

装饰器函数

装饰器函数是高阶函数的一种应用: 输入参数是函数, 返回值也是函数

def decorator_func(func):
    def wrapped_func(*args, **kwargs):
        print(args, kwargs)
        return func(*args, **kwargs)
    return wrapped_func

装饰器函数使用

# 原始函数
def mysum(*args):
    return sum(args)

# 对函数进行包装
new_sum = decorator_func(mysum)

# 测试
print(mysum[1, 2, 3])
print(new_sum([1, 2, 3])

装饰器语法糖@

@decorator_func
def mysum(*args):
    return sum(args)

# 测试
print(mysum([1, 2, 3]))

装饰器函数应用

装饰器函数示例1

# mysum、mysub两个函数都需要进行类型检测
# 显而易见, 他们的类型判断部分代码高度重复

def mysum(a, b)
      if type(a) == int and type(b) == int:
          return a + b
      else:
          print("只能进行整数运算")

def mysub(a, b)
      if type(a) == int and type(b) == int:
          return a - b
      else:
          print("只能进行整数运算")

# 利用装饰器函数优化代码
def decorator_func(func):
    def warpped_func(*args, **kwargs):
        if type(a) == int and type(b) == int:
            return func(*args)
        else:
            print("只能进行整数运算")

@decoraor_func
def mysum(a, b):
    return a + b

@decorator_func
def mysub(a, b):
    return a - b

# 测试
mysum("a", "b")
mysub("a", "b")

带参数的装饰器函数

在日常开发中会经常看到装饰器包含参数, 比如下面的代码就是flask的路由配置装饰器

@app.route("/index")
def index():
    pass

@app.route("/member")
def member():
    pass

# 装饰器route关键部分
# 装饰器route返回的是最终的装饰器
def route(rule):
    def decorator(func):
        endpoind = options.pop("endpoind", None)
        self.add_url_rule(rule, endpoind, func, **options)
        return func
    return decorator

带参数的装饰器函数示例

# 使用装饰器函数定义两个函数
# 第一个函数对传入的整数进行求和
# 第二个函数对传入的字符串进行拼接
# 对装饰器的要求, 传入str,就要求输入是字符串,传入int, 就要求输入是整数

# 装饰器函数
def valid_type_setup(input_type):
    def decorator_func(func):
        def wrapped_func(*args, **kwargs):
            for arg in args:
                if type(arg) != input_type:
                    print("输入类型必须是:", input_type)
                    return
            return func(*args, **kwargs)
        return wrapped_func
    return decorator_func

# 对函数进行装饰
@valid_type_setup(int):
def int_process(*args):
    return sum(args)

@valid_type_setup(str):
def str_process(*args):
    return "".join(args)

装饰器顺序

一个函数如果被多个装饰器装饰,装饰顺序由内而外

def decorator_f1(func):
    def wrapped_func(*args, **kwargs):
        print("f1")
        return func(*args, **kwargs)
    return wrapped_func

def decorator_f2(func):
    def wrapped_func(*args, **kwargs):
        print("f2")
        return func(*args, **kwargs)
    return wrapped_func

def my_func(*args):
    print(args)
func = decorator_f1(decorator_f2(my_func))
func()

@decorator_f1
@decorator_f2
def func(*args):
    print(args)

装饰器函数练习

# 根据环境变量debug是否为True, 决定函数执行时是否打印日志

Python学习手册-