匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

【Python】Python装饰器,让你的代码更优雅!

【Python】Python装饰器,让你的代码更优雅!

在Python编程中,装饰器是一种非常有用的功能,它可以让你在不修改原有的代码的情况下,增加新的功能或者修改原有的功能。因此,装饰器的应用可以让你的代码更加优雅。

一、什么是装饰器

装饰器是一个可以装饰函数、方法或者类的函数,它的作用是在不改变原函数的前提下,给原函数附加一些额外的功能。在Python中,装饰器的底层逻辑实际上是一个闭包,它接收一个函数对象作为参数,返回一个经过装饰后的函数对象。

二、装饰器的语法

装饰器的语法是比较简单的,它的格式如下:

```
@decorator
def function():
    pass
```

其中,@decorator是装饰器的名称,function是要被装饰的函数。装饰器可以接收一个函数对象作为参数,返回一个经过修改后的函数对象。

三、使用装饰器

使用装饰器的过程也比较简单,它的步骤如下:

1. 定义一个装饰器函数,该函数接收一个函数对象作为参数,返回一个经过修改后的函数对象

2. 在需要被装饰的函数上面添加装饰器

下面是一个简单的示例代码:

```
def my_decorator(func):
    def wrapper():
        print('执行函数之前')
        func()
        print('执行函数之后')
    return wrapper

@my_decorator
def say_hello():
    print('Hello World!')

say_hello()
```

在这个示例中,我们定义了一个装饰器函数my_decorator,它接收一个函数对象作为参数,返回一个新的函数对象wrapper。wrapper函数在执行被装饰的函数之前和之后,分别打印了一些额外的信息。接着,我们使用@my_decorator装饰了一个函数say_hello,然后调用它,输出结果如下:

```
执行函数之前
Hello World!
执行函数之后
```

可以看到,我们成功地为say_hello函数添加了额外的功能,而且并不需要改变原有的代码,这就是装饰器的优雅之处。

四、常见的装饰器应用

1. 计算函数执行时间的装饰器

```
import time

def timeit(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print('函数执行时间为:{:.3f}秒'.format(end - start))
        return result
    return wrapper

@timeit
def my_function():
    print('start')
    time.sleep(1)
    print('end')

my_function()
```

在这个示例中,我们定义了一个装饰器函数timeit,它在函数执行前记录了开始时间,函数执行后记录了结束时间,然后输出了函数执行的时间。接着,我们使用@timeit装饰了一个函数my_function,然后调用它,输出结果如下:

```
start
end
函数执行时间为:1.001秒
```

可以看到,通过使用装饰器,我们成功地实现了记录函数执行时间的功能,而且并不需要改变原有的代码。

2. 检查函数参数类型的装饰器

```
def check_args(func):
    def wrapper(*args, **kwargs):
        arg_types = func.__annotations__
        for i in range(len(args)):
            if type(args[i]) != arg_types[list(arg_types.keys())[i]]:
                raise TypeError('参数类型错误')
        for key in kwargs:
            if type(kwargs[key]) != arg_types[key]:
                raise TypeError('参数类型错误')
        result = func(*args, **kwargs)
        return result
    return wrapper

@check_args
def my_function(x: int, y: float, z: str):
    print(x, y, z)

my_function(1, 2.0, 'hello')
```

在这个示例中,我们定义了一个装饰器函数check_args,它接收一个函数对象作为参数,然后检查函数参数的类型是否正确。如果参数类型错误,就会抛出一个TypeError异常。接着,我们使用@check_args装饰了一个函数my_function,它的参数分别是一个int型、一个float型和一个str型。然后,我们调用my_function,传入正确的参数类型,输出结果如下:

```
1 2.0 hello
```

可以看到,my_function正常执行了,因为我们通过装饰器检查了参数类型,确保了程序的正确性。

五、总结

装饰器是Python编程中非常常用的功能,它可以让你的代码更加优雅、更加简洁。使用装饰器可以增加代码的重用性、可读性和可维护性,因此Python编程中应该掌握装饰器的使用。如果你对Python装饰器还不熟悉,可以通过编写小程序来学习和掌握装饰器的使用。