python 10个好用的装饰器(非常详细)零基础入门到精通,收藏这一篇就够了

341 篇文章 71 订阅
228 篇文章 4 订阅

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.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值