当前位置: 首页 > wzjs >正文

江西省住房和建设规划局局网站关键词排名网络推广

江西省住房和建设规划局局网站,关键词排名网络推广,市直部门网站建设维护工作总结,网站需要维护吗装饰器(Decorator) 是 Python一种强大的语法特性,允许在不修改原函数或类代码的前提下,动态地扩展其功能。和其名字一样,装饰器的核心思想就是"包装",即通过将函数或类作为参数传递给另一个函数&…

装饰器(Decorator) 是 Python一种强大的语法特性,允许在不修改原函数或类代码的前提下,动态地扩展其功能。和其名字一样,装饰器的核心思想就是"包装",即通过将函数或类作为参数传递给另一个函数(装饰器),返回一个增强后的新函数或类。

核心概念

  1. 函数是一等对象
    Python 中函数可以像变量一样传递、赋值或作为返回值,这是装饰器的基础。

  2. 闭包(Closure)
    内部函数可以访问外部函数的变量,即使外部函数已执行完毕。

  3. 语法糖 @
    @decorator 等价于 func = decorator(func),简化装饰器的应用。

示例

def my_decorator(func):def wrapper():print("函数执行前...")func()print("函数执行后...")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()
输出:

原理

装饰器的本质是函数嵌套,@my_decorator 等价于:

say_hello = my_decorator(say_hello)

如何处理带参数的函数

函数可以使用 *args 和 **kwargs 接受任意参数:

def my_decorator(func):def wrapper(*args, **kwargs):print(f"参数: args={args}, kwargs={kwargs}")return func(*args, **kwargs)return wrapper@my_decorator
def add(a, b):return a + bprint(add(3, b=4))
输出:

如何保留原函数元信息

如果不使用functools.wraps,被装饰的函数的名称、文档字符串等会被替换,可能导致调试困难。因此,应该使用functools.wraps来保留原函数的元数据。

from functools import wraps
import timedef my_decorator(func):@wraps(func)  # 使用@wraps保留原函数信息def wrapper(*args, **kwargs):import timestart = time.time()result = func(*args, **kwargs)end = time.time()print(f"{func.__name__} 执行耗时: {end - start:.2f}秒")return resultreturn wrapper@my_decorator
def my_func():"""模拟耗时操作"""time.sleep(1)my_func()
print(my_func.__name__)

输出:
编辑
 
如果不使用@wraps,则会输出 wrapper


带参数的装饰器

装饰器本身是可以接受参数的,但需要多一层嵌套:

from functools import wrapsdef repeat(n):"""重复执行函数 n 次"""def decorator(func):@wraps(func)def wrapper(*args, **kwargs):for _ in range(n):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator@repeat(5)
def greet(name):print(f"Hello, {name}!")greet("Tom")
输出:

类装饰器

类也可以作为装饰器,需实现 __call__ 方法:

class Test:def __init__(self, func):self.func = funcself.calls = 0def __call__(self, *args, **kwargs):self.calls += 1print(f"函数 {self.func.__name__} 被调用了第 {self.calls} 次")return self.func(*args, **kwargs)@Test
def say_hi():print("Hi!")say_hi() 
say_hi()

输出:

装饰器的应用场景

  1. 日志记录
    记录函数调用参数、返回值或异常。

  2. 性能计时
    统计函数执行时间。

  3. 权限校验
    在 Web 框架中检查用户权限(如 Flask/JWT)。

  4. 缓存结果
    缓存函数结果避免重复计算(如 @lru_cache)。

  5. 路由注册
    Web 框架中用装饰器定义路由(如 Flask 的 @app.route)。

注意事项

  1. 装饰器顺序
    如果使用一个装饰器装饰另一个装饰器,是按从下到上的顺序执行:

    @decorator1
    @decorator2
    def func():pass

    等价于 func = decorator1(decorator2(func))

  2. 不要影响原函数行为
    确保装饰器不要影响原函数的行为,如参数、返回值等。

  3. 正确使用wraps保留元信息
    在使用装饰器时,要正确使用 functools.wraps 保留元信息,方便调试。

码字不易,原创更不易,如您觉得本文对您有帮助,麻烦动动您富贵的小手,点赞、收藏、关注、订阅!!!

http://www.dtcms.com/wzjs/272920.html

相关文章:

  • seo优化能提高网站的流量吗西地那非片的正确服用方法
  • 泉山徐州网站开发网站流量统计分析报告
  • 如何免费制作企业网站无代码建站
  • 跨境电商网站排行榜网页制作用什么软件做
  • wordpress站标签打开空白长沙关键词快速排名
  • 营销型网站典型十大舆情网站
  • 邦邻营销型网站建设wordpress网站建设
  • 中山手机网站建设哪家好手机关键词点击排名软件
  • 免费的行情软件网站下载免费国际形势最新消息
  • alexa全球网站排名分析搜索引擎seo
  • 单仁网站建设环球网今日疫情消息
  • 湖南网站建站系统平台推广关键词外包
  • 大专软件技术工资一般多少seo推广网址
  • 珠海网站设计广告推广软文案例
  • 广东建设监理网站百度下载安装最新版
  • 佛山网络优化推广公司如何优化推广中的关键词
  • 做简历网站 知乎网站建设的基本流程
  • 部门子网站建设方案大数据获客系统
  • 做网站有兼职的吗百度指数购买
  • 诚讯网站设计seo快速排名代理
  • 网站1688批发雅思培训机构哪家好机构排名
  • java网站开发源码谷歌平台推广外贸
  • 小学免费资源网站模板自己怎么开电商平台
  • 用wordpress制作网站模板下载房产网站建设
  • 政府网站建设管理工作情况汇报如何让自己的网站快速被百度收录
  • 济南网站制推广新产品最好的方法
  • 淘宝可做的团购网站seo网站诊断
  • 个人简介网页制作代码网站优化方案案例
  • wordpress主题blogseo相关岗位
  • 国内网站为什么要备案网站设计与制作毕业论文范文