Python Python装饰器的常见用途

Python Python装饰器的常见用途

在本文中,我们将介绍Python装饰器的常见用途。装饰器是Python中一种强大的编程工具,它可以在不修改原有代码的情况下为函数或类添加额外的功能。通过装饰器,我们可以将一些常用的代码逻辑封装成可复用的函数,提高代码的可读性和维护性。

阅读更多:Python 教程

1. 日志记录

装饰器可以用来记录函数的运行日志,方便调试和查看程序的执行过程。下面是一个简单的日志记录装饰器的示例:

def log(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function: {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} finished execution")
        return result
    return wrapper

@log
def add(a, b):
    return a + b

print(add(1, 2))
Python

输出结果为:

Calling function: add
Function add finished execution
3
Python

2. 计时器

装饰器还可以用来计算函数的执行时间,对代码的性能进行评估和优化。下面是一个简单的计时器装饰器的示例:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {func.__name__} executed in {end_time - start_time} seconds")
        return result
    return wrapper

@timer
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))
Python

输出结果为:

Function fibonacci executed in 0.0038492679595947266 seconds
55
Python

3. 缓存

装饰器还可以用来实现函数的缓存,避免重复计算,提高代码的执行效率。下面是一个简单的缓存装饰器的示例:

def cache(func):
    memo = {}
    def wrapper(*args):
        if args not in memo:
            memo[args] = func(*args)
        return memo[args]
    return wrapper

@cache
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))
Python

输出结果为:

55
Python

4. 授权和验证

装饰器还可以用来处理授权和验证的逻辑,保护代码的安全性。下面是一个简单的授权装饰器的示例:

def login_required(func):
    def wrapper(*args, **kwargs):
        if is_logged_in():
            return func(*args, **kwargs)
        else:
            return "Please login first"
    return wrapper

@login_required
def dashboard():
    return "Welcome to the dashboard"

print(dashboard())
Python

输出结果为:

Please login first
Python

5. 性能分析

装饰器还可以用来对代码的性能进行分析,找出运行效率低下的部分进行优化。下面是一个简单的性能分析装饰器的示例:

import cProfile

def profiled(func):
    def wrapper(*args, **kwargs):
        profiler = cProfile.Profile()
        profiler.enable()
        result = func(*args, **kwargs)
        profiler.disable()
        profiler.print_stats()
        return result
    return wrapper

@profiled
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))
Python

输出结果为:

         178 calls (4 primitive calls) in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      109    0.000    0.000    0.000    0.000 <ipython-input-1-3f4e3b5104c4>:10(fibonacci)
       10    0.000    0.000    0.000    0.000 <ipython-input-1-3f4e3b5104c4>:9(fibonacci)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
       56    0.000    0.000    0.000    0.000 {method 'enable' of '_lsprof.Profiler' objects}

55
Python

总结

Python装饰器是一种强大的编程工具,常见的用途包括日志记录、计时器、缓存、授权和验证以及性能分析等。通过使用装饰器,我们可以轻松地为函数或类添加额外的功能,提高代码的可读性和维护性。学习和灵活运用装饰器将有助于提高我们的编程技能,并使我们的代码更加高效和可靠。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册