Python 装饰器简单使用

        在Python编程中,装饰器(Decorators)是一种强大且优雅的功能,它允许我们在不修改原有函数代码的情况下,给函数增加新的功能。装饰器本质上是一个函数,它接收一个函数作为参数并返回一个新的函数,这个新函数就是原始函数的增强版。装饰器的使用极大地提高了代码的可重用性和可维护性,是Python编程中的一大亮点。

1.装饰器的基本使用

装饰器的基本语法非常简单,这里通过一个简单的例子来展示其用法。

假设我们有一个简单的函数,用于计算一个数的平方:

def square(x):
    return x * x



        现在,我们想要在不修改`square`函数的情况下,增加一个打印日志的功能,记录函数的调用情况。这时,我们可以定义一个装饰器来实现这个功能:

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with {args} and {kwargs}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned {result}")
        return result
    return wrapper

@log_decorator
def square(x):
    return x * x

        使用装饰器后的square函数
        print(square(5))

在这个例子中,`@log_decorator`就是装饰器的应用方式,它告诉Python在调用`square`函数之前,先调用`log_decorator`函数,并将`square`函数作为参数传递给`log_decorator`。`log_decorator`函数返回一个`wrapper`函数,这个`wrapper`函数就是实际被调用的函数,它包含了原始`square`函数的调用以及额外的日志打印功能。

2.装饰器的进阶使用

装饰器不仅可以用于简单的日志记录,还可以用于更复杂的场景,比如权限校验、性能测试、事务管理等。

2.1带参数的装饰器

如果装饰器本身需要参数,我们可以通过定义一个返回装饰器的函数来实现。

def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                result = func(*args, **kwargs)
                print(result)
        return wrapper
    return decorator_repeat

@repeat(3)
def greet(name):
    return f"Hello, {name}!"

greet("Alice")

2.2类作为装饰器

        Python也允许使用类作为装饰器,通过在类中实现`__call__`和`__init__`方法,我们可以定义更加复杂的装饰器逻辑。

class Profile:
    def __init__(self, func):
        self.func = func
        self.num_calls = 0

    def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print(f'Call {self.num_calls} to {self.func.__name__}')
        return self.func(*args, **kwargs)

@Profile
def my_function():
    """A docstring"""
    print("Hello from my_function")

my_function()
my_function()


 

 3.总结

Python的装饰器是一种强大且灵活的工具,它提供了一种优雅的方式来扩展和修改函数的行为。通过装饰器,我们可以在不修改原有函数代码的情况下,增加日志记录、性能测试、权限校验等多种功能,极大地提高了代码的可重用性和可维护性。掌握装饰器的使用,将使你的Python编程更加高效和优雅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值