怎么样上传网站资料wordpress报表工具

张小明 2026/1/9 1:39:18
怎么样上传网站资料,wordpress报表工具,发稿媒体平台,做的最好的微电影网站thon 装饰器#xff08;Decorator#xff09;是一种高级语法#xff0c;用于在不修改原函数代码的前提下#xff0c;动态扩展函数或类的功能。它本质上是一个接收函数 / 类作为参数#xff0c;并返回新函数 / 类的可调用对象#xff0c;是函数式编程的典型应用。1、核心原…thon 装饰器Decorator是一种高级语法用于在不修改原函数代码的前提下动态扩展函数或类的功能。它本质上是一个接收函数 / 类作为参数并返回新函数 / 类的可调用对象是函数式编程的典型应用。1、核心原理装饰器的核心依赖于 Python 的两个特性函数函数可以作为参数传递、作为返回值返回、赋值给变量。闭包嵌套函数可以访问外层函数的变量和参数即使外层函数已执行完毕。1.1 装饰器的基本结构一个最简单的装饰器由外层函数接收原函数 和内层函数包装原函数 组成最终返回内层函数def decorator(func): # 外层函数接收原函数作为参数def wrapper(*args, **kwargs): # 内层函数包装原函数*args, **kwargs 兼容任意参数print(装饰器逻辑执行前) # 扩展功能执行前result func(*args, **kwargs) # 调用原函数print(装饰器逻辑执行后) # 扩展功能执行后return result # 返回原函数结果return wrapper # 返回内层函数# 使用装饰器语法糖装饰器名decoratordef target_func():print(原函数逻辑)# 调用被装饰的函数target_func()执行结果装饰器逻辑执行前原函数逻辑装饰器逻辑执行后说明decorator 等价于 target_func decorator(target_func)即原函数被装饰器返回的 wrapper 函数替换。1.2 装饰器的执行时机装饰器在模块加载时导入时 就会执行而非函数调用时。例如print(模块加载中...)def decorator(func):print(f装饰器执行装饰 {func.__name__})return funcdecoratordef func1():passdecoratordef func2():passprint(模块加载完成)执行结果先执行装饰器再执行后续代码模块加载中...装饰器执行装饰 func1装饰器执行装饰 func2模块加载完成2、进阶用法2.1 带参数的装饰器若需要给装饰器传递参数如日志的级别、缓存的过期时间需在外层再套一层 “参数接收函数”def log_decorator(level): # 最外层接收装饰器参数def decorator(func): # 中间层接收原函数def wrapper(*args, **kwargs):print(f[{level}] 函数 {func.__name__} 开始执行) # 使用装饰器参数result func(*args, **kwargs)print(f[{level}] 函数 {func.__name__} 执行结束)return resultreturn wrapperreturn decorator# 使用带参数的装饰器log_decorator(levelINFO)def add(a, b):return a bprint(add(1, 2))执行结果[INFO] 函数 add 开始执行[INFO] 函数 add 执行结束32.2 类装饰器类也可以作为装饰器核心是实现 __call__ 方法使类实例可调用class TimerDecorator:def __init__(self, func): # 初始化时接收原函数self.func funcdef __call__(self, *args, **kwargs): # 调用时执行装饰逻辑import timestart time.time()result self.func(*args, **kwargs) # 调用原函数end time.time()print(f函数 {self.func.__name__} 执行耗时{end - start:.2f}s)return result# 使用类装饰器TimerDecoratordef slow_func(seconds):import timetime.sleep(seconds) # 模拟耗时操作slow_func(1) # 执行被装饰的函数执行结果函数 slow_func 执行耗时1.00s2.3 装饰器的嵌套多个装饰器可以叠加使用嵌套装饰器的核心是装饰顺序和调用顺序的区别理解这两个顺序是掌握嵌套装饰器的关键。# 定义两个装饰器def decorator_a(func):def wrapper(*args, **kwargs):print(装饰器 A 开始)result func(*args, **kwargs)print(装饰器 A 结束)return resultreturn wrapperdef decorator_b(func):def wrapper(*args, **kwargs):print(装饰器 B 开始)result func(*args, **kwargs)print(装饰器 B 结束)return resultreturn wrapper# 嵌套应用装饰器decorator_adecorator_bdef target():print(执行目标函数)# 调用目标函数target()执行结果装饰器 A 开始装饰器 B 开始执行目标函数装饰器 B 结束装饰器 A 结束2.3.1 装饰顺序从下到上“包裹顺序”装饰器的应用过程发生在函数定义时本质是对函数的 “层层包裹”。对于上面的例子decorator_adecorator_bdef target(): ...等价于手动执行# 第一步用 decorator_b 装饰原始 target得到新函数 wrapper_bwrapper_b decorator_b(target)# 第二步用 decorator_a 装饰 wrapper_b得到最终函数 wrapper_atarget decorator_a(wrapper_b)即先执行下方的装饰器再执行上方的装饰器最终得到的 target 是最外层装饰器decorator_a返回的 wrapper 函数。2.3.2 调用顺序从外到内“执行顺序”当调用被装饰的函数如 target()时执行流程是从最外层装饰器的 wrapper 开始逐层进入内层最后执行原始函数再逐层返回。以上面的 target() 调用为例执行流程拆解调用 target() 实际是调用 decorator_a 返回的 wrapper_awrapper_a 中先执行自身逻辑print(装饰器 A 开始)然后调用 func此时 func 是 decorator_b 返回的 wrapper_bwrapper_b 中先执行自身逻辑print(装饰器 B 开始)然后调用 func此时 func 是原始 target 函数执行原始 target 函数print(执行目标函数)原始函数执行完毕返回结果给 wrapper_bwrapper_b 执行后续逻辑print(装饰器 B 结束)wrapper_b 执行完毕返回结果给 wrapper_awrapper_a 执行后续逻辑print(装饰器 A 结束)最终结果返回给调用者。简言之调用时先执行外层装饰器的 “前置逻辑”再执行内层装饰器的 “前置逻辑”然后是原始函数最后按相反顺序执行各装饰器的 “后置逻辑”。2.4 保留原函数元信息装饰器默认会覆盖原函数的元信息如 __name__、__doc__需使用 functools.wraps 修复import functoolsdef bad_decorator(func):def wrapper():func()return wrapper # 未保留元信息def good_decorator(func):functools.wraps(func) # 保留原函数元信息def wrapper():func()return wrapperbad_decoratordef f1():f1 的文档字符串passgood_decoratordef f2():f2 的文档字符串passprint(f1.__name__) # 输出wrapper错误print(f1.__doc__) # 输出None错误print(f2.__name__) # 输出f2正确print(f2.__doc__) # 输出f2 的文档字符串正确2.5 装饰类的方法2.5.1 装饰实例方法实例方法是类中最常见的方法第一个参数默认是 self指向实例本身。装饰实例方法时装饰器需要正确传递 self 及其他参数。用装饰器记录实例方法的调用日志import functools# 定义装饰器记录方法调用的参数、返回值def log_instance_method(func):functools.wraps(func) # 保留原方法的元信息如 __name__、__doc__def wrapper(self, *args, **kwargs):# 打印实例信息、方法名、参数print(f[日志] 实例 {self} 调用方法 {func.__name__}参数{args}关键字参数{kwargs})# 调用原始方法注意传递 selfresult func(self, *args, **kwargs)# 打印返回值print(f[日志] 方法 {func.__name__} 返回{result})return resultreturn wrapper# 定义类用装饰器装饰实例方法class User:def __init__(self, name):self.name name # 实例属性# 用装饰器装饰实例方法log_instance_methoddef greet(self, prefix):向用户打招呼return f{prefix}我是 {self.name}# 测试user User(Alice)user.greet(你好)执行结果[日志] 实例 __main__.User object at 0x102b5a4d0 调用方法 greet参数(你好,)关键字参数{}[日志] 方法 greet 返回你好我是 Alice关键说明装饰器的 wrapper 函数第一个参数必须是 self或用 *args 兼容否则无法传递实例引用func(self, *args, **kwargs) 确保原始方法能正确接收 self 及其他参数functools.wraps(func) 保留原方法的元信息如 user.greet.__name__ 仍为 greet而非 wrapper。2.5.2 装饰类方法类方法用 classmethod 装饰第一个参数默认是 cls指向类本身。装饰类方法时需注意装饰器与 classmethod 的顺序以及 cls 参数的传递。用装饰器验证类方法的参数import functools# 定义装饰器检查类方法的参数是否为正数def validate_positive(func):functools.wraps(func)def wrapper(cls, *args, **kwargs):# 检查所有位置参数是否为正数for arg in args:if not isinstance(arg, (int, float)) or arg 0:raise ValueError(f类方法 {func.__name__} 接收无效参数{arg}必须为正数)# 调用原始类方法传递 clsreturn func(cls, *args, **kwargs)return wrapper# 定义类用装饰器装饰类方法class MathUtils:# 注意装饰器顺序先应用功能装饰器再用 classmethod从下到上装饰classmethodvalidate_positivedef multiply(cls, a, b):计算两个正数的乘积类方法return a * b# 测试print(MathUtils.multiply(3, 4)) # 正常调用输出 12MathUtils.multiply(-2, 5) # 触发验证失败ValueError执行结果12ValueError: 类方法 multiply 接收无效参数-2必须为正数关键说明装饰器顺序classmethod 必须放在功能装饰器的下方即先被装饰因为 classmethod 会将方法转换为类方法功能装饰器需要装饰转换后的方法wrapper 函数第一个参数是 cls确保原始类方法能接收类引用类方法操作的是类本身如 cls.__name__而非实例装饰器可基于类属性做校验。2.5.3 装饰静态方法静态方法用 staticmethod 装饰无默认参数与普通函数类似。装饰静态方法时处理逻辑与装饰普通函数一致。用装饰器记录静态方法的执行时间import functoolsimport time# 定义装饰器记录方法执行时间def timer(func):functools.wraps(func)def wrapper(*args, **kwargs):start time.time()result func(*args, **kwargs) # 静态方法无 self/cls直接传递参数end time.time()print(f[计时] 静态方法 {func.__name__} 执行耗时{end - start:.4f} 秒)return resultreturn wrapper# 定义类用装饰器装饰静态方法class StringUtils:# 装饰器顺序staticmethod 在下功能装饰器在上staticmethodtimerdef reverse(s):反转字符串静态方法time.sleep(0.1) # 模拟耗时操作return s[::-1]# 测试print(StringUtils.reverse(hello)) # 输出olleh执行结果[计时] 静态方法 reverse 执行耗时0.1002 秒olleh关键说明静态方法无 self 或 cls装饰器的 wrapper 函数直接用 *args, **kwargs 接收参数即可装饰器顺序与类方法类似staticmethod 在下功能装饰器在上确保装饰的是静态方法。3、装饰器的应用场景日志记录自动记录函数的调用参数、返回值、执行时间。权限验证调用函数前检查用户权限如登录状态。def login_required(func):functools.wraps(func)def wrapper(user, *args, **kwargs):if not user.is_login:raise PermissionError(请先登录)return func(user, *args, **kwargs)return wrapperlogin_requireddef pay(user, amount):print(f{user.name} 支付 {amount} 元)缓存结果缓存函数的计算结果避免重复计算。from functools import lru_cachelru_cache(maxsize128)def expensive_calculation(x, y):# 模拟耗时计算time.sleep(1)return x * y x**2 y**2# 第一次调用会计算result1 expensive_calculation(10, 20)# 第二次相同参数的调用会直接从缓存返回result2 expensive_calculation(10, 20)异常处理统一捕获函数执行中的异常避免程序崩溃。import functoolsfrom typing import Callable, Any, Type, Tuple, Optionaldef exception_handler(exceptions: Tuple[Type[Exception], ...] (Exception,),default: Any None,re_raise: bool False,error_msg: Optional[str] None) - Callable:异常处理装饰器捕获指定异常并统一处理:param exceptions: 需要捕获的异常类型元组默认捕获所有Exception:param default: 异常发生时返回的默认值若re_raise为False:param re_raise: 捕获异常后是否重新抛出默认False不抛出:param error_msg: 自定义错误提示信息默认为异常自带消息:return: 装饰后的函数def decorator(func: Callable) - Callable:functools.wraps(func) # 保留原函数元信息def wrapper(*args: Any, **kwargs: Any) - Any:try:# 执行原函数return func(*args, **kwargs)except exceptions as e:# 若需要重新抛出异常交给上层处理if re_raise:raise # 保持原异常类型和堆栈# 否则返回默认值return defaultreturn wrapperreturn decorator# 示例1捕获ValueError和TypeError返回默认值exception_handler(exceptions(ValueError, TypeError),default-1,error_msg数值转换失败)def parse_number(s: str) - int:将字符串转换为整数return int(s)# 示例2捕获IOError重新抛出异常让调用者处理exception_handler(exceptions(IOError,),re_raiseTrue,error_msg文件读取失败)def read_file(path: str) - str:读取文件内容with open(path, r) as f:return f.read()
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

济南网站app开发的百度识图网页版 在线

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2026/1/7 20:20:51 网站建设

柴油发电机组网站建设价格东莞优化网站关键词优化

如何快速掌握Iwara视频高效下载:新手完整教程 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool IwaraDownloadTool是一款专为Iwara视频平台设计的智能下载工具&#x…

张小明 2026/1/8 1:08:40 网站建设

新开的网站怎么做seo优化wordpress自定义内容的小工具

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2026/1/7 8:26:37 网站建设

东莞做商城网站建设哪家好新媒体营销推广公司

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个基于ResNet的图像分类模型,集成通道注意力机制,在CIFAR-10数据集上进行训练和测试。要求:1. 实现基础的ResNet-18架构;2. 在…

张小明 2026/1/7 10:32:47 网站建设

苏州建设网站教程开通微信公众号要钱吗

摘要 随着社会经济的快速发展和人们生活水平的提高,宠物猫逐渐成为现代家庭中的重要成员。宠物猫的认养需求日益增长,传统的线下认养方式存在信息不对称、流程繁琐等问题,亟需一个高效、透明的线上平台来解决这些问题。基于此,开发…

张小明 2026/1/7 6:43:22 网站建设

网站营销代理如何创建邮箱

目录 前言 一、字符串 1.字符串的定义 2.字符串的切片 3.字符串的操作方法 查找方法 修改方法 判断方法 补充 二、列表 1.列表的定义 2.列表的相关操作 查操作 增操作 删操作 改操作 三、元组 1.元组的定义 2.元组的应用场景 查询方法 总结 前言 在Python编程的舞台上&#xff…

张小明 2026/1/7 6:56:42 网站建设