Python基础篇(十一):装饰器

装饰器

  • 前言
  • 1. 装饰器的定义
  • 2. 装饰器的应用
  • 3. 装饰器的语法
  • 4. func(*args, **kwargs)

前言

装饰器是Python中一种强大的函数或类修饰机制,用于在不修改原始函数或类代码的情况下,对其进行功能扩展或修改。装饰器基于函数式编程的概念,通过将函数作为参数传递给另一个函数,并返回一个新的函数来实现。

下面是关于装饰器的介绍和示例:

1. 装饰器的定义

装饰器是一个函数,它接受一个函数作为输入,并返回一个新的函数作为输出。装饰器可以在不修改原始函数的情况下,为其添加额外的功能或修改其行为。(感觉像java中的面向切面编程~)

2. 装饰器的应用

装饰器常用于以下场景:

  • 添加日志记录
  • 计时统计
  • 输入验证和修正
  • 缓存结果
  • 权限验证
  • 错误处理

3. 装饰器的语法

装饰器使用@符号紧跟在函数定义的上方,表示将函数装饰为另一个函数。装饰器函数可以接受任意数量的参数,并返回一个新的函数。 在示例中,decorator函数是一个装饰器函数,它接受一个函数作为参数并返回一个新的函数wrapperwrapper函数在调用原始函数之前和之后执行一些操作,然后调用原始函数并返回其结果。通过在原始函数上方使用@decorator语法,将原始函数装饰为经过装饰器修饰的新函数。

示例:

def decorator(func):
    def wrapper(*args, **kwargs):
        # 在调用原始函数之前执行的操作
        print("执行装饰器前操作")
        # 调用原始函数
        result = func(*args, **kwargs)
        # 在调用原始函数之后执行的操作
        print("执行装饰器后操作")
        # 返回原始函数的结果
        return result
    return wrapper

# 应用装饰器
@decorator
def my_function():
    print("原始函数")

# 调用装饰后的函数
my_function()

运行以上示例,将会输出:

执行装饰器前操作
原始函数
执行装饰器后操作

Python基础篇(十一):装饰器_第1张图片
Python基础篇(十一):装饰器_第2张图片

装饰器是Python中强大且常用的特性,它可以轻松地扩展和修改函数的功能,同时提高了代码的可重用性和可读性。在实际开发中,装饰器常用于切面编程和元编程,为代码添加横切关注点和动态功能。

4. func(*args, **kwargs)

func(*args, **kwargs) 是一种在函数调用时传递可变数量参数的方式,其中 argskwargs 是两种常用的参数形式。

  • *args 表示将参数作为一个元组(tuple)传递给函数。它允许你传递任意数量的位置参数给函数,这些参数会被打包成一个元组传递给函数内部。函数内部可以使用 args 来访问这个元组,并对其中的参数进行操作。

  • **kwargs 表示将参数作为一个字典(dict)传递给函数。它允许你传递任意数量的关键字参数给函数,这些参数会被打包成一个字典传递给函数内部。函数内部可以使用 kwargs 来访问这个字典,并对其中的参数进行操作。

下面示例来说明 func(*args, **kwargs) 的使用:

def example_func(*args, **kwargs):
    print("位置参数:")
    for arg in args:
        print(arg)
    
    print("关键字参数:")
    for key, value in kwargs.items():
        print(key, value)

# 传递位置参数和关键字参数
example_func(1, 2, 3, name="John", age=25)

运行以上示例,将会输出:

位置参数:
1
2
3
关键字参数:
name John
age 25

在示例中,example_func 函数使用了 *args**kwargs 来接受任意数量的位置参数和关键字参数。通过调用 example_func(1, 2, 3, name="John", age=25),将 1、2 和 3 作为位置参数传递,而 name 和 age 则作为关键字参数传递。函数内部可以使用 argskwargs 来访问这些参数,并对它们进行操作。这种方式使得函数能够处理不确定数量的参数,使函数的使用更加灵活和通用。

你可能感兴趣的:(#,python基础学习,python,开发语言)