Python 中的装饰器是一种特殊类型的函数,它们允许你修改其他函数的功能。装饰器本质上是一个函数,它接收一个函数作为参数并返回一个新的函数。使用装饰器可以在不修改原有函数代码的情况下增加额外的功能,这使得装饰器在实现诸如日志记录、性能测试、事务处理、缓存、权限校验等方面非常有用。
1.基本的装饰器
查看my_decorator
2.使用带参数的装饰器
这个例子中的 greet 函数会打印三次 "Hello ('Alice', '小明')",因为它被装饰为重复执行三次。
3.装饰器的实际应用
装饰器广泛应用于实现跨切面编程,比如:
日志记录:自动记录函数的调用详情。
性能测试:测量和报告函数执行时间。
事务处理:确保函数内的操作作为一个整体执行,如在数据库操作中。
权限验证:检查执行某个函数前用户是否有足够的权限。
装饰器是 Python 高级编程中非常强大的工具,能够使代码更加干净、优雅而且可重用。
4.代码详情
# -*- coding: utf-8 -*-
# 无参数装饰器
def my_decorator(func):
def wrapper():
print("Something is happening before the function is called.")
func()
print("Something is happening after the function is called.")
return wrapper
# 有参数装饰器,在装饰器前面添加一层函数
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator_repeat
@my_decorator
def say_hello():
print("Hello!")
@repeat(num_times=3)
def greet(*args, **kwargs):
print(f"Hello {args}")
if __name__ == '__main__':
say_hello()
# 输出:
# Something is happening before the function is called.
# Hello!
# Something is happening after the function is called.
greet("Alice", 'xiaoming', book='python')
# 输出
# Hello ('Alice', '小明')
# Hello ('Alice', '小明')
# Hello ('Alice', '小明')
5. 注
在 Python 中,args 和 *kwargs 是两种用于函数定义中,处理不定数量参数的方式。它们允许你创建可接受任意数量参数的函数,无论是位置参数还是关键字参数。下面是详细说明:
*args
args 是用来将不确定数量的位置参数传递给一个函数。它是一个约定用法,args 只是一个变量名,你可以使用任何其他变量名(比如 params),但最佳实践是使用 args。这些参数在函数内部被处理为一个元组。
使用示例:
def print_args(*args):
for arg in args:
print(arg)
print_args('Hello', 'world', 123, 'Python')
这个函数可以接受任意数量的参数,*args 将所有传递的位置参数收集到一个名为 args 的元组中。
**kwargs
kwargs 允许你将不确定数量的关键字参数传递给函数。kwargs 代表 "keyword arguments",它在函数内部被处理为一个字典。与 *args 类似,kwargs 也不是必须的名字,你可以使用任何有效的变量名(比如 options),但最佳实践是使用 kwargs。
使用示例:
def print_kwargs(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_kwargs(name='Alice', age=25, language='Python')
这个函数可以接受任意数量的关键字参数,**kwargs 将所有关键字参数收集到一个名为 kwargs 的字典中,其中字典的键是参数的名称,值是参数的值。
组合使用 args 和 *kwargs
你可以在同一个函数中同时使用 args 和 *kwargs 来接受任意类型和数量的参数:
def function_example(*args, **kwargs):
print("args:", args)
print("kwargs:", kwargs)
function_example(1, 2, 3, a='Hello', b='World')
输出:
args: (1, 2, 3)
kwargs: {'a': 'Hello', 'b': 'World'}
这种组合允许函数同时接受位置参数和关键字参数,其中位置参数以元组的形式存在于 args 中,而关键字参数以字典的形式存在于 kwargs 中。
这些功能使得 Python 函数非常灵活,能够处理多种不同的调用情形,特别是在你需要创建功能丰富的 API 或进行高级参数处理时非常有用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。