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

创意设计网站大全外贸网站谷歌seo

创意设计网站大全,外贸网站谷歌seo,wordpress新建页面是空白的,天元建设集团有限公司王士坤什么是装饰器? 装饰器(Decorator)本质上是一个 修改其他函数功能的函数。它的核心思想是:不修改原函数代码,动态添加新功能。比如: 记录函数执行时间 检查用户权限 缓存计算结果 自动重试失败操作 理解…
  1. 什么是装饰器?
    装饰器(Decorator)本质上是一个 修改其他函数功能的函数。它的核心思想是:不修改原函数代码,动态添加新功能。比如:

记录函数执行时间

检查用户权限

缓存计算结果

自动重试失败操作

  1. 理解函数是“对象”
    在 Python 中,函数也是对象,可以像变量一样传递。这是装饰器的核心基础!
示例 1:函数赋值给变量
python
复制
def say_hello():print("Hello!")

将函数赋值给变量

greet = say_hello  

调用变量(实际调用函数)

greet()  # 输出: Hello!
示例 2:函数作为参数传递
python
复制
def call_twice(func):func()  # 第一次调用func()  # 第二次调用call_twice(say_hello)  
# 输出:
# Hello!
# Hello!
  1. 最简单的装饰器
    假设我们要在函数执行前后打印日志:

步骤 1:定义一个装饰器函数

python
复制
def log_decorator(func):def wrapper():print("函数开始执行...")func()  # 调用原函数print("函数执行完毕!")return wrapper  # 返回新函数

步骤 2:使用装饰器

python
复制
@log_decorator  # 语法糖(等价于 say_hello = log_decorator(say_hello)
def say_hello():print("Hello!")say_hello()# 输出:
# 函数开始执行...
# Hello!
# 函数执行完毕!
  1. 装饰器的执行过程
    当使用 @log_decorator 时,实际发生了以下步骤:

传递函数:log_decorator(say_hello) 被调用,参数是原函数 say_hello

返回新函数:log_decorator 返回内部定义的 wrapper 函数

替换原函数:say_hello 变量指向新的 wrapper 函数

  1. 处理带参数的函数
    如果被装饰的函数需要参数,怎么办?让 wrapper 接受参数并传递给原函数。

示例:记录函数参数

python
复制
def log_args(func):def wrapper(*args, **kwargs):  # 接受任意参数print(f"参数: args={args}, kwargs={kwargs}")return func(*args, **kwargs)  # 传递参数给原函数return wrapper@log_args
def add(a, b):return a + bprint(add(3, b=5))  
# 输出:
# 参数: args=(3,), kwargs={'b': 5}

8

  1. 装饰器带参数
    如果装饰器本身需要参数(比如指定日志级别),需要再包裹一层。

示例:根据日志级别打印

python
复制
def log_level(level):  # 外层函数接受参数def decorator(func):  # 装饰器函数def wrapper(*args, **kwargs):print(f"[{level}] 函数开始执行...")result = func(*args, **kwargs)print(f"[{level}] 函数执行完毕!")return resultreturn wrapperreturn decorator  # 返回装饰器@log_level("INFO")  # 等价于 add = log_level("INFO")(add)
def add(a, b):return a + badd(2, 3)
# 输出:
# [INFO] 函数开始执行...
# [INFO] 函数执行完毕!
  1. 保留原函数的信息
    使用装饰器后,原函数的名称(name)和文档(doc)会被替换为 wrapper。用 functools.wraps 解决这个问题:
python
复制
from functools import wrapsdef log_decorator(func):@wraps(func)  # 保留原函数信息def wrapper(*args, **kwargs):print("开始执行...")result = func(*args, **kwargs)print("执行完毕!")return resultreturn wrapper@log_decorator
def say_hello():"""打招呼的函数"""print("Hello!")print(say_hello.__name__)  # 输出: say_hello(而不是 wrapper)
print(say_hello.__doc__)   # 输出: 打招呼的函数
  1. 类装饰器
    除了函数,还可以用类实现装饰器。通过实现 call 方法:
python
复制
class CountCalls:def __init__(self, func):self.func = funcself.calls = 0def __call__(self, *args, **kwargs):self.calls += 1print(f"函数被调用了 {self.calls} 次")return self.func(*args, **kwargs)@CountCalls
def say_hello():print("Hello!")say_hello()  # 输出: 函数被调用了 1 次 → Hello!
say_hello()  # 输出: 函数被调用了 2 次 → Hello

!
9. 实际应用场景
装饰器在 Python 中广泛应用,例如:

Web框架:@app.route(“/”)(Flask/Django)

权限验证:@login_required

性能测试:计算函数执行时间

缓存:@lru_cache(内置装饰器)

总结
核心思想:装饰器通过“函数嵌套”和“函数作为参数”实现功能扩展。

关键点:

使用 @decorator 语法糖

处理参数:*args 和 **kwargs

保留原函数信息:@wraps(func)

类装饰器:实现 call 方法

试着写几个自己的装饰器(比如记录执行时间),就能快速掌握这个概念!

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

相关文章:

  • 大连开发区社保网站营销策划咨询
  • 我想找工作没学历网站搜索引擎优化方法
  • 鹤壁 网站建设桂平网络推广
  • 动态网站设计与开发心得体会开发一个小程序一般需要多少钱呢
  • 保山网站建设百度推广服务费3000元
  • 如何给网站添加搜索关键字百度关键词热度
  • 深圳建设局网站注册结构师培训附件长春网站优化服务
  • 什么网站可以做钟点工怎么下载app到手机上
  • 校园网站设计长沙seo优化公司
  • 中山 网站设计专业放心关键词优化参考价格
  • 网上做调查赚钱的网站网站开发的步骤
  • app下载推广百度seo官网
  • 做自己的首席安全官的网站优化公司哪家好
  • 自贡做网站的公司广州百度网站排名优化
  • 请详细说明网站开发流程及原则百度推广官方电话
  • 山东省建设监理协会网站打不开外贸seo推广公司
  • 网站建设周期百度一下百度网页版
  • 专门做推广的网站青岛网站快速排名优化
  • 做网站需要用到什么网站开发工具
  • 生成图片的网站小说搜索风云榜
  • 专家库 网站 建设方案浏览器网站大全
  • 微信小程序+网站开发西安百度推广优化公司
  • 男人做爽的免费网站网站运营主要做什么工作
  • 网站建设商务通什么意思百度推广客服投诉电话
  • 网站建设一般多少钱一年如何自己建网站
  • 滕州网站建设助企网络手机百度旧版本下载
  • 简洁中文网站模板网站搜索引擎推广
  • 特色的合肥网站建设深圳网站建设推广方案
  • 手机网站php开发免费找客户软件
  • 沭阳哪里可以做网站广州百度关键词搜索