python函数修饰符的使用
python函数修饰符@ 修饰符 ‘@’符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行。也就是说@A def f(): 是非法的。 只可以在模块或类定义层内对函数进行修饰,不允许修修饰一个类。一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。 本质上讲,装饰符@类似于 回调函数,把其它的函数(暂且称为目的参数,后面紧接着的函数)作为自己的入参,在目的函数执行前,执行一些自己的操作, 比如:计数、打印一些提示信息等,然后返回目的函数。下面列举一个简单的例子。
创建函数修饰符的规则:
(1)修饰符是一个函数
(2)修饰符取被修饰函数为参数
(3)修饰符返回一个新函数
(4)修饰符维护被维护函数的签名
例子1: 被修饰函数不带参数 def log(func): def wrapper(): print("log开始 ...") func() print("log结束 ...") return wrapper @log def test(): print("test ..") test()
运行结果: log开始 ... test .. log结束 ...
例子2: 使用functools模块提供的修改函数属性的方法wraps def log(func): def wrapper(): print("log开始 ...") func() print("log结束 ...") return wrapper @log def test1(): print("test1 ..") def test2(): print("test2 ..") print(test1.__name__) print(test2.__name__)
运行结果: wrapper test2
可见test1的函数名称变了,如果某些代码用到就会出问题,可以使用functools模块提供的修改函数属性的方法wraps from functools import wraps def log(func): @wraps(func) def wrapper(): print("log开始 ...") func() print("log结束 ...") return wrapper @log def test1(): print("test1 ..") def test2(): print("test2 ..") print(test1.__name__) print(test2.__name__)
运行结果: test1 test2
例子3: 被修饰函数带参数 from functools import wraps def log(func): @wraps(func) def wrapper(*args,**kwargs): print("log开始 ...",func.__name__) ret = func(*args,**kwargs) print("log结束 ...") return ret return wrapper @log def test1(s): print("test1 ..", s) return s @log def test2(s1, s2): print("test2 ..", s1, s2) return s1 + s2 test1("a") test2("a","bc")
运行结果: log开始 ... test1 test1 .. a log结束 ... log开始 ... test2 test2 .. a bc log结束 ...
例子4: 修饰符带参数 ,需要比上面例子多一层包装 from functools import wraps def log(arg): def _log(func): @wraps(func) def wrapper(*args,**kwargs): print("log开始 ...",func.__name__, arg) ret = func(*args,**kwargs) print("log结束 ...") return ret return wrapper return _log @log("module1") def test1(s): print("test1 ..", s) return s @log("module1") def test2(s1, s2): print("test2 ..", s1, s2) return s1 + s2 test1("a") test2("a","bc")
运行结果: log开始 ... test1 module1 test1 .. a log结束 ... log开始 ... test2 module1 test2 .. a bc log结束 ...
目前室内定位技术应用在哪些领域?SKYLAB室内定位方案基于位置信息的服务从室外延伸到室内,基于蓝牙技术,UWB技术的人员定位方案,资产定位方案,也凭借精准位置信息,电子围栏,轨迹回放等功能提高了企业人员,资产管理的效率及精准度。本篇S
数据驱动的需求预测和智能补货赋能高效供应链管理零售究其本质,是效率与服务的结合零售管理巴里伯曼传统零售目前数智化程度的不足,导致许多需求预测全靠从业人员的专家经验。这种纯粹凭个人经验和感觉的预测方式使得供应链库存经常高企,同时
模玩资讯SUYATA塑雅塔不思议博物馆怪奇独角兜中国新兴模型品牌空SUYATA塑雅塔(SUYATA社),旗下的不思议博物馆机械甲虫系列,在首弹的机械奇异长戟兜后,再度推出第二弹的怪奇独角兜组装模型,帅气兼具可爱!预计将于2021
盈利仅1实体生鲜零售面临的经营痛点及对策现存生鲜电商平台超4000家,仅有1盈利,4盈亏平衡,88亏损,7巨亏,生鲜电商平台竞争异常激烈。据中国连锁经营协会资料,2019年,有的生鲜零售商依靠资本速度崛起,有的不堪客流量
GarminEnduro新品上市电力超越你的体力极限Garmin佳明宣布全新推出卓越续航力的GPS多功能户外手表Enduro,该手表具有智能电源管理模式和PowerGlass太阳能充电镜面,可通过太阳能充电将电池续航延长至65天1。
华硕B560重炮手助你沉浸体验幽灵猎人公司近日,由StudioGoupil开发制作发行的恐怖游戏幽灵猎人公司正式上线Steam商城,虽说是抢先体验版,但依然获得了众多好评。该作是一款受超自然电影启发的恐怖游戏,支持单人或四
工程车辆如何借助GPS模块来管理建筑行业的蓬勃发展也使得越来越多的工程车辆投入到使用中,相比通勤用车,工程车辆大多价格昂贵,因此多以租赁为主。车辆所有者为防止拖欠和盗车行为发生,投入使用的工程车辆都会安装车载定位
闲鱼,一个量产魔幻现实主义作家的地方江南皮革厂也许倒闭了,但是精神代代相传永不灭。在带货成为潮流,人人都出二手的今天,写营销文案已经成了当代人的基本素养。谁能想到,Marketing竟能成为一代显学,而聪明的中国人已
太久不出第三季,一拳超人两位作者被传不合,老粉们根本不慌一拳超人动画开播已经有6年时间了,但第三季一直迟迟没有消息,这让不少粉丝都十分着急,时间一久甚至开始各种分析猜想,试图找到其中的原因。而最近更是出现了一拳超人两位作者不合,才导致动
精密环形导轨的耐用程度精密环形导轨属于滚轮式导轨,是环形导轨循环运动系统的基础与核心部件。一般的循环流水线,如皮带式流水线滚筒式流水线,具有较大的运动间隙,不具有足够的刚性和定位精度。而由环形导轨组成的
摩托罗拉edge轻奢版,2K价位的小黑马,还有点好看虽说现在摩托罗拉的名气没那么大了,但实力放在那里,还是值得一看的。比如说摩托罗拉edge轻奢版,在轻薄手机行列,还是能占得一席之地的官方数据来看,摩托罗拉edge轻奢版的厚度是6。