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

通用装饰器示例

from functools import wrapsdef deco(func):@wraps(func)                        # 保留原函数的 __name__、__doc__ 等def _deco(*args, **kwargs):print(f"before {func.__name__} called.")    #或者写作#print("before %s called." % func.__name__)ret = func(*args, **kwargs)print(f" after {func.__name__} called. result: {ret}")return retreturn _deco@deco
def myfunc(a, b):print(f" myfunc({a},{b}) called.")return a + b@deco
def myfunc2(a, b, c):print(f" myfunc2({a},{b},{c}) called.")return a + b + c# 示例调用
myfunc(1, 2)
myfunc2(1, 2, 3)

逐行讲解

def deco(func):

定义装饰器工厂deco,参数func就是“被装饰的原函数”。

def _deco(*args,**kwargs):

定义包装器_deco。用*args,**kwargs接住原函数可能的所有位置参数/关键字参数,使装饰器对任意签名的函数都通用

@deco

def myfunc(a,b):

语法糖:等价于myfunc=deco(myfunc)

从这一行开始,“myfunc”这个名字实际上指向的是包装器_deco,内部再去调原来的myfunc函数体

语法糖

在最后面补充个有意思的东西:语法糖

 一、为什么要有 @deco 语法?

这两句是完全等价的:

@decodef myfunc(): ...
def myfunc():...myfunc = deco(myfunc)

那 Python 为什么还要多此一举加一个 @ 语法呢?
——因为 Python 追求的是可读性和简洁性

如果有多个装饰器:

@deco1 
@deco2 
@deco3 
def myfunc():...

这相当于:

def myfunc():...
myfunc = deco1(deco2(deco3(myfunc)))

明显使用@语法 简化了代码结构 + 提高了可读性
这就是“语法糖”的作用。

二、“语法糖”是什么意思?

@decomyfunc = deco(myfunc)语法糖

“语法糖(syntactic sugar)”的意思是:
语法上更甜、更好看,但不增加任何新功能

它不会改变语言本身的功能,只是让代码写起来更自然、更“人类友好”。

比如👇

普通写法语法糖写法说明
myfunc = deco(myfunc)@deco装饰器的语法糖
a = a + 1a += 1语法糖(更短)
for i in range(len(lst)):for i, v in enumerate(lst):语法糖(更优雅)
def f(x): return x*xf = lambda x: x*xlambda 语法糖

Python 的设计哲学之一是:“让代码像自然语言一样优雅”,
所以引入了很多这样的“糖”式语法,让程序员写起来更舒服。

http://www.dtcms.com/a/508942.html

相关文章:

  • LangChain最详细教程(一)
  • ui设计的网站群晖nda做网站
  • 郑州企业网站设计高端网站建设要多少钱
  • Marin说PCB之SI----做信号完整性仿真时需要注意的地方--03
  • 东莞市住房建设局网站西昌网站建设
  • windows平台,导出数据库
  • 有效的网站推广方案申请域名注册备案平台
  • 如何用Redis实现乐观锁?
  • 商城网站建设公司招聘php+mysql网站开发技术与典型案例导航【源代码】
  • 免费注册个人网站不花钱网站网页设计
  • 滁州网站开发公司电话盐城网站建设找宇
  • gerrit的部署与配置关联到不同服务器上的git仓库
  • Nginx静态网站:从原理到实战
  • 建一个o2o网站网站建设与管理好找工作吗
  • 在线做c 题的网站网站空间如何升级
  • 建电影网站教程学做网站要学什么软件
  • 菏泽网站建设培训学校WordPress无法加载插件js
  • 公司网站建设包含的内容美食网站设计的基本思路
  • 专门做外贸的的网站有哪些展示型企业网站营销目标主要有
  • 如何规划电子商务网站淘宝推广网站怎么建设
  • 网站嵌套代码计算机毕设代做网站
  • 联合需求计划(JRP)详解
  • Visual Studio 2022安装时共享组件、工具、SDK路径无法更改的问题
  • 网站地图什么时候提交好从头建设个人网站步骤
  • 多多返利网站建设企业网站建设时优化关键词的问题
  • 高精度定位数据获取 MQ10具体应用说明
  • 接口测试基础
  • 外贸推广网站有哪些网站主体负责人和网站负责人
  • Git的小组协作
  • 打开一个网站双流区规划建设局网站