python 10个好用的装饰器(非常详细)零基础入门到精通,收藏这一篇就够了
Python装饰器是一种特殊类型的函数,它可以修改或增强其他函数的功能,而无需更改原始函数的源代码。装饰器本质上是一个接收函数作为参数的函数,它返回一个新的函数或者修改过的原函数,通常用于插入日志、性能测试、权限校验、缓存、事务处理等场景。利用functools.lru_cache实现结果缓存,避免重复计算。使用cProfile进行性能分析。用于测量函数执行时间。确保函数参数类型正确。在异常发生时
·
Python装饰器是一种特殊类型的函数,它可以修改或增强其他函数的功能,而无需更改原始函数的源代码。装饰器本质上是一个接收函数作为参数的函数,它返回一个新的函数或者修改过的原函数,通常用于插入日志、性能测试、权限校验、缓存、事务处理等场景。
1. 计时装饰器 (@timer)
用于测量函数执行时间。
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__} executed in {end_time - start_time} seconds")` `return result` `return wrapper``@timer``def example_function():` `time.sleep(1)``example_function()``输出:``example_function executed in 1.0021049690246582 seconds
2. 日志装饰器 (@log_execution)
记录函数调用的日志。
import logging``logging.basicConfig(level=logging.INFO)``def log_execution(func):` `def wrapper(*args, **kwargs):` `logging.info(f"Calling {func.__name__} with args: {args}, kwargs: {kwargs}")` `result = func(*args, **kwargs)` `logging.info(f"{func.__name__} returned: {result}")` `return result` `return wrapper``@log_execution``def add(a, b):` `return a + b``add(3, 5)``输出:``INFO:root:Calling add with args: (3, 5), kwargs: {}``INFO:root:add returned: 8
3. 缓存装饰器 (@lru_cache)
利用functools.lru_cache实现结果缓存,避免重复计算。
from functools import lru_cache``@lru_cache(maxsize=None)``def fibonacci(n):` `if n < 2:` `return n` `else:` `return fibonacci(n-1) + fibonacci(n-2)``print(fibonacci(10))``输出:``55
4. 类型检查装饰器 (@type_check)
确保函数参数类型正确。
def type_check(*arg_types):` `def decorator(func):` `def wrapper(*args, **kwargs):` `for arg, expected_type in zip(args, arg_types):` `if not isinstance(arg, expected_type):` `raise TypeError(f"Argument {arg} is not of type {expected_type}")` `return func(*args, **kwargs)` `return wrapper` `return decorator``@type_check(int, int)``def multiply(x, y):` `return x * y``print(multiply(2, 3))``输出:``6
5. 单例装饰器 (@singleton)
确保类的实例唯一。
class SingletonMeta(type):` `_instances = {}` `def __call__(cls, *args, **kwargs):` `if cls not in cls._instances:` `cls._instances[cls] = super().__call__(*args, **kwargs)` `return cls._instances[cls]``class Singleton(metaclass=SingletonMeta):` `pass``s1 = Singleton()``s2 = Singleton()``print(s1 is s2)``输出:``True
6. 重试装饰器 (@retry_on_exception)
在异常发生时自动重试。
import random``def retry_on_exception(max_retries=3, exceptions=(Exception,), delay=1):` `def decorator(func):` `def wrapper(*args, **kwargs):` `retries = 0` `while retries < max_retries:` `try:` `return func(*args, **kwargs)` `except exceptions as e:` `print(f"Caught {e}. Retrying...")` `retries += 1` `time.sleep(delay)` `raise Exception("Max retries exceeded.")` `return wrapper` `return decorator``@retry_on_exception(max_retries=3)``def might_fail():` `if random.randint(0, 2) == 0:` `raise ValueError("Failed.")` `print("Success!")``might_fail()``输出可能为:``Caught ValueError('Failed.'). Retrying...``Caught ValueError('Failed.'). Retrying...``Caught ValueError('Failed.'). Retrying...``Max retries exceeded.``或``Success!
7. 性能度量装饰器 (@profile)
使用cProfile进行性能分析。
import cProfile``def profile(func):` `def wrapper(*args, **kwargs):` `profiler = cProfile.Profile()` `profiler.enable()` `result = func(*args, **kwargs)` `profiler.disable()` `profiler.print_stats()` `return result` `return wrapper``@profile``def dummy_function(n):` `sum([i**2 for i in range(n)])``dummy_function(100000)``输出为函数执行的性能统计信息。
8. 身份验证装饰器 (@authenticate)
确保用户已登录。
def authenticate(user_required=True):` `def decorator(func):` `def wrapper(*args, **kwargs):` `if not user_required or user_is_logged_in(): # 假设 user_is_logged_in 是验证函数` `return func(*args, **kwargs)` `else:` `raise PermissionError("User not authenticated.")` `return wrapper` `return decorator``@authenticate``def sensitive_operation():` `print("Sensitive operation performed.")``# 假设已经登录``sensitive_operation()``输出:``Sensitive operation performed.
9. 异步装饰器 (@asyncio.coroutine 或 async def)
用于异步操作。
import asyncio``async def async_decorator(func):` `async def wrapper(*args, **kwargs):` `print("Starting async task...")` `result = await func(*args, **kwargs)` `print("Async task finished.")` `return result` `return wrapper``@async_decorator``async def long_running_task():` `await asyncio.sleep(2)` `return "Task done."``asyncio.run(long_running_task())``输出:``Starting async task...``Async task finished.
10. 验证输入装饰器 (@validate_input)
确保输入满足特定条件。
def validate_input(minimum=0, maximum=100):` `def decorator(func):` `def wrapper(value):` `if not (minimum <= value <= maximum):` `raise ValueError(f"Value must be between {minimum} and {maximum}")` `return func(value)` `return wrapper` `return decorator``@validate_input(1, 10)``def process_value(value):` `print(f"Processing value: {value}")``process_value(5)``输出:``Processing value: 5
## 题外话
黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
**1.学习路线图**
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6b23c375be664af6a9486fdd6b4d8520.png)
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
**2.视频教程**
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/33337b025b97437ba0bdd1130f88ceff.png)
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
***[🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源](https://mp.weixin.qq.com/s?__biz=Mzk0MzcyNjMyNg==&mid=2247483661&idx=1&sn=f9016d1122c527db658eca1705706d22&chksm=c32eca94f459438230696041114a17ae97485d9d687aae1fc890b3c143724ec8b802afa32be7&token=927606081&lang=zh_CN#rd)***
**3.技术文档和电子书**
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f53754587f6b4a13ac8167b6b1efb92e.png)
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
***[🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源](https://mp.weixin.qq.com/s?__biz=Mzk0MzcyNjMyNg==&mid=2247483661&idx=1&sn=f9016d1122c527db658eca1705706d22&chksm=c32eca94f459438230696041114a17ae97485d9d687aae1fc890b3c143724ec8b802afa32be7&token=927606081&lang=zh_CN#rd)***
**4.工具包、面试题和源码**
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。
***[🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源](https://mp.weixin.qq.com/s?__biz=Mzk0MzcyNjMyNg==&mid=2247483661&idx=1&sn=f9016d1122c527db658eca1705706d22&chksm=c32eca94f459438230696041114a17ae97485d9d687aae1fc890b3c143724ec8b802afa32be7&token=927606081&lang=zh_CN#rd)***
最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ff63d757858b40499ed9da3c51be071b.png)
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
***[🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源](https://mp.weixin.qq.com/s?__biz=Mzk0MzcyNjMyNg==&mid=2247483661&idx=1&sn=f9016d1122c527db658eca1705706d22&chksm=c32eca94f459438230696041114a17ae97485d9d687aae1fc890b3c143724ec8b802afa32be7&token=927606081&lang=zh_CN#rd)***
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
更多推荐
已为社区贡献5条内容
所有评论(0)