Python中使用Decorators函数的10个例子
发布时间:2023-07-06 07:35:31
装饰器是Python中一个强大而有趣的概念。它们允许在不修改已有代码的情况下修改函数的行为。装饰器函数接受一个函数作为输入,并返回一个修改后的函数。在这篇文章中,我将给出10个使用装饰器的实际例子。
1. 计时器
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"函数 {func.__name__} 运行时间:{end_time - start_time} 秒")
return result
return wrapper
@timer
def my_function():
time.sleep(2)
my_function()
这个装饰器能够测量函数的运行时间,并打印出来。它接受一个函数作为输入,创建一个新的闭包函数并返回。
2. 缓存
def cache(func):
cached_results = {}
def wrapper(*args):
if args in cached_results:
return cached_results[args]
result = func(*args)
cached_results[args] = result
return result
return wrapper
@cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10))
这个装饰器用于缓存函数的结果。如果函数被调用了多次,那么结果将被缓存起来,避免重复计算。
3. 输入验证
def validate_input(func):
def wrapper(*args):
for arg in args:
if not isinstance(arg, int):
raise ValueError("输入必须为整数")
return func(*args)
return wrapper
@validate_input
def add(a, b):
return a + b
print(add(2, 3))
print(add("2", 3))
这个装饰器用于验证函数的输入是否满足条件。在这个例子中,它验证输入是否是整数类型。
4. 输出转换
def to_upper(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result.upper()
return wrapper
@to_upper
def greet(name):
return f"Hello, {name}!"
print(greet("John"))
这个装饰器用于将函数的输出转换成大写。
5. 权限验证
def login_required(func):
def wrapper(*args, **kwargs):
if not is_logged_in():
raise PermissionError("请先登录")
return func(*args, **kwargs)
return wrapper
@login_required
def secret_page():
return "秘密页面"
print(secret_page())
这个装饰器用于验证用户是否登录,如果没有登录,则抛出权限错误。
6. 日志记录
def log(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
with open("log.txt", "a") as f:
f.write(f"函数 {func.__name__} 被调用
")
return result
return wrapper
@log
def do_something():
return "完成"
print(do_something())
这个装饰器用于记录函数的调用次数和调用时间。在这个例子中,log.txt 文件将被打开并且添加一行日志。
7. 压缩
import zlib
def compress(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return zlib.compress(result.encode())
return wrapper
@compress
def get_data():
return "这是一段数据"
data = get_data()
print(data)
print(zlib.decompress(data).decode())
这个装饰器用于对函数的输出进行压缩。在这个例子中,它使用 zlib 库对字符串进行了压缩和解压缩。
8. 路由
routes = {}
def route(path):
def decorator(func):
routes[path] = func
return func
return decorator
@route("/")
def home():
return "首页"
@route("/about")
def about():
return "关于我们"
print(routes)
print(routes["/"]())
print(routes["/about"]())
这个装饰器用于创建基于路径的路由。在这个例子中,它使用字典来存储路由映射,每个路径对应一个函数。
9. 归一化
def normalize(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result.lower().strip()
return wrapper
@normalize
def get_name():
return " John Doe "
print(get_name())
这个装饰器用于将函数的输出转换成小写,并去除多余的空格。
10. 重试
import random
def retry(max_attempts):
def decorator(func):
def wrapper(*args, **kwargs):
attempts = 0
while attempts < max_attempts:
try:
return func(*args, **kwargs)
except Exception as e:
print(f"重试 ({attempts+1}/{max_attempts})...")
attempts += 1
time.sleep(1)
raise Exception("重试失败")
return wrapper
return decorator
@retry(3)
def connect_to_server():
if random.randint(0, 5) < 4:
raise ConnectionError("连接失败")
return "连接成功"
print(connect_to_server())
这个装饰器用于在函数失败时重试指定次数。在这个例子中,如果连接失败,它将重试3次。(当然可以自定义重试的次数)
这些例子涵盖了装饰器的一些常见用法,从简单的计时器到复杂的重试机制。装饰器是Python中一种强大的工具,可以帮助你更加清晰和高效地编写代码。希望这篇文章对你有所帮助!
