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

抚州做网站公司哪家好甘肃兰州大学

抚州做网站公司哪家好,甘肃兰州大学,建设工程材料登记备案申请网站,建设银行国际互联网站Python装饰器详解 装饰器(Decorator)是 Python 中一种强大的语法特性,允许在不修改原始代码的情况下动态扩展函数或类的功能。以下是其语法、用法、优缺点及常见使用场景的详细说明: 一、装饰器语法 1. 基本结构 装饰器本质上…

Python装饰器详解

装饰器(Decorator)是 Python 中一种强大的语法特性,允许在不修改原始代码的情况下动态扩展函数或类的功能。以下是其语法、用法、优缺点及常见使用场景的详细说明:

一、装饰器语法

1. 基本结构

装饰器本质上是一个可调用对象(函数或类),接受一个函数作为输入,返回一个新的函数(或类)。

def decorator(func):def wrapper(*args, **kwargs):# 前置操作(如日志、权限校验)result = func(*args, **kwargs)  # 调用原函数# 后置操作(如数据处理、清理)return resultreturn wrapper@decorator  # 等价于 func = decorator(func)
def func():pass

2. 带参数的装饰器

通过嵌套函数实现装饰器参数传递:

def decorator_with_args(param):def actual_decorator(func):def wrapper(*args, **kwargs):print(f"Decorator param: {param}")return func(*args, **kwargs)return wrapperreturn actual_decorator@decorator_with_args("config")
def func():pass

3. 类装饰器

通过实现 __call__ 方法让类的实例成为装饰器:

class ClassDecorator:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):print("Class decorator")return self.func(*args, **kwargs)@ClassDecorator
def func():pass

4. 多个装饰器叠加

执行顺序:从下往上(靠近函数的装饰器先执行):

@decorator1
@decorator2
def func():pass
# 等价于 func = decorator1(decorator2(func))

二、优点

  • 代码复用性:将通用功能(如日志、权限校验)抽离成装饰器,避免重复代码。
  • 非侵入式扩展:遵循开放-封闭原则(对扩展开放,对修改封闭),无需修改原函数代码。
  • 简洁性:通过 @ 语法让代码更清晰,逻辑分离更明确。
  • 灵活组合:多个装饰器可叠加使用,灵活组合不同功能。

三、缺点

  • 调试困难:装饰器可能隐藏原函数的元信息(如 __name__、文档字符串),需用 functools.wraps 修复:

    from functools import wraps
    def decorator(func):@wraps(func)  # 保留原函数元信息def wrapper(*args, **kwargs):return func(*args, **kwargs)return wrapper
    
  • 过度嵌套:多层装饰器可能导致代码可读性下降。

  • 隐式行为:装饰器的副作用可能导致代码行为难以预测(尤其是第三方装饰器)。

四、常见使用场景

1. 日志记录

import time
from functools import wrapsdef log_time(func):@wraps(func)def wrapper(*args, **kwargs):start = time.time()result = func(*args, **kwargs)end = time.time()print(f"Function {func.__name__} took {end - start:.2f} seconds to run.")return resultreturn wrapper@log_time
def example_function(n):sum = 0for i in range(n):sum += ireturn sumresult = example_function(1000000)
print(f"Result: {result}")

运行结果:

Function example_function took 0.07 seconds to run.
Result: 499999500000

2. 权限校验

from functools import wrapsclass User:def __init__(self, authenticated):self.is_authenticated = authenticateddef login_required(func):@wraps(func)def wrapper(user, *args, **kwargs):if not user.is_authenticated:raise PermissionError("User not logged in")return func(user, *args, **kwargs)return wrapper@login_required
def admin_dashboard(user):return "Welcome to the admin dashboard!"user = User(authenticated=True)
print(admin_dashboard(user))user = User(authenticated=False)
try:print(admin_dashboard(user))
except PermissionError as e:print(e)

运行结果:

Welcome to the admin dashboard!
User not logged in

3. 缓存(Memoization)

from functools import lru_cache@lru_cache(maxsize=128)
def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)print(fibonacci(10))

运行结果:

55

4. 路由注册

from flask import Flaskapp = Flask(__name__)@app.route("/")
def home():return "Hello World"@app.route("/about")
def about():return "About Page"if __name__ == "__main__":app.run(debug=True)

运行结果:

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 123-456-789

访问 http://127.0.0.1:5000/ 将显示 “Hello World”,访问 http://127.0.0.1:5000/about 将显示 “About Page”。

5. 性能监控

from functools import wraps
import time
import tracemallocdef performance_monitor(func):@wraps(func)def wrapper(*args, **kwargs):tracemalloc.start()start_time = time.time()result = func(*args, **kwargs)end_time = time.time()current, peak = tracemalloc.get_traced_memory()tracemalloc.stop()print(f"Function {func.__name__} executed in {end_time - start_time:.2f}s")print(f"Memory usage: Current = {current / 10**6:.2f}MB, Peak = {peak / 10**6:.2f}MB")return resultreturn wrapper@performance_monitor
def memory_intensive_function():data = [i for i in range(1000000)]return len(data)memory_intensive_function()

运行结果:

Function memory_intensive_function executed in 0.07s
Memory usage: Current = 7.63MB, Peak = 7.63MB

五、总结

  • 适用场景:需要为多个函数统一添加公共功能的场景(如日志、缓存、校验)。
  • 慎用场景:过度使用会导致代码复杂化,尤其是多层装饰器嵌套时。
  • 最佳实践:保持装饰器功能单一,使用 functools.wraps 保留元信息,避免深层嵌套。

装饰器是 Python 高阶编程的核心工具之一,合理使用可以显著提升代码质量和可维护性。

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

相关文章:

  • 山东外贸行业网站开发网站续费文档
  • 骏域网站建设专家东莞创建属于自己的网站
  • 建设厅焊工证查询网站给浏览器加速的加速器
  • 网站建设维护的相关基本知识家乡网站建设
  • 个人网站设计内容seo诊断分析在线工具
  • 深圳市住房和城乡建设部网站软件定制开发的发展前景
  • 网络公司 开发网站深圳网站设计设计
  • 手机做网站视频成都网站建设优化公司电话
  • 手机网站背景图尺寸免费软件推荐
  • 企业品牌网站开发制作合同优化设计答案六年级上册语文
  • 郑州大型网站建设上传软件的网站
  • 临沂在线做网站哪些网站做任务好赚钱
  • 网站设计)卖水果网站建设的策划书
  • 北京网站建设公司哪家实惠wordpress安装到阿里云主机
  • 汕头网站建设只需要800郑州网站优化技巧
  • 南昌企业免费建站嵌入式培训什么意思
  • 免费软件制作网站10个著名摄影网站
  • phpnow 新建网站医院网站php源码
  • 麒麟网站建设哪里有做网站技术
  • 化妆培训网站模板企业融资风险及其防范措施
  • 昌乐网站设计创作网
  • 做旅行义工网站蚁热搜榜上2023年热门话题
  • 做姓氏图的网站电子商务具体是干什么的
  • 网站空间商查询网站开发研究手段有哪些
  • 不需要写代码的网站开发软件网站建设 套餐
  • 公司做网站合同wordpress企业官网主题下载地址
  • seo网站建设刘贺稳营销专家a企业网站建设的建议
  • 网站页面设计怎么收费上海债务优化公司
  • 宁波学校网站建设wordpress 评论群发
  • 怎么看网站蜘蛛专业网站优化方案