欢迎访问宙启技术站
智能推送

Python中的装饰器函数:装饰器实现方式和应用场景

发布时间:2023-06-23 17:37:02

Python中的装饰器函数是一种高级语法特性,用于增强一个函数或者类的功能而无需修改其代码或继承,这为代码的重复利用提供了非常有效的方式。本文将介绍装饰器实现方式和应用场景。

1. 装饰器的实现方式

在Python中,装饰器是一种特殊的函数,它的作用是动态的修改或增强某个函数或类的功能。装饰器函数是使用“@”符号和函数名的方式来应用的。

- 带参数的装饰器

def decorator_param(param):
    def real_decorator(func):
        def wrapper(*args, **kwargs):
            print(param)
            result = func(*args, **kwargs)
            return result
        return wrapper
    return real_decorator

@decorator_param("Hello World")
def test():
    print("test")

test()    # Hello World test 

- 多重装饰器

def decorator1(func):
    def wrapper():
        print("Decorator 1")
        func()
        print("Decorator 1")
    return wrapper

def decorator2(func):
    def wrapper():
        print("Decorator 2")
        func()
        print("Decorator 2")
    return wrapper
    
@decorator1
@decorator2
def test():
    print("test")

test()    # Decorator 1 Decorator 2 test Decorator 2 Decorator 1

2. 装饰器的应用场景

装饰器在Python中应用广泛,常见的场景包括:

- 用户权限控制

def check_user(func):
    def wrapper(*args, **kwargs):
        if user_login():
            return func(*args, **kwargs)
        else:
            redirect_to_login()
    return wrapper

@check_user
def profile():
    show_profile()

profile()    # 如果用户已经登陆,显示用户信息,否则跳转到登陆页

- 函数的缓存

cache = {}

def memoize(func):
    def wrapper(*args, **kwargs):
        key = (args, tuple(kwargs.items()))
        if key not in cache:
            cache[key] = func(*args, **kwargs)
        return cache[key]
    return wrapper

@memoize
def fibonacci(n):
    if n in (0, 1):
        return n
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(50))    # 计算出第50个斐波那契数,统计缓存命中率,优化性能

- 记录日志

import logging

def log(func):
    logger = logging.getLogger(func.__name__)
    def wrapper(*args, **kwargs):
        logger.info("Arguments: %s, %s" % (args, kwargs))
        result = func(*args, **kwargs)
        logger.info("Result: %s" % result)
        return result
    return wrapper

@log
def test():
    print("test")

test()    # 记录函数的调用日志和返回结果,方便排查问题

在以上的场景中,我们使用装饰器实现了用户权限控制、缓存和日志记录等功能,这同时也很好的体现了开放封闭原则,增加新的功能只需增加新的装饰器即可,而无需修改原有的代码。

总结:本文介绍装饰器函数的实现方式和应用场景,通过几个具体的例子,展示了装饰器函数能够非常好的增强函数的能力,让Python成为一门非常灵活和强大的编程语言。