装饰器内部传参的使用

来源:互联网 发布:淘宝加盟开店 编辑:程序博客网 时间:2024/05/22 01:33

一般在应用装饰器时,装饰器名副其实,就是完全的装饰作用,没有任何实际功用。


但有时为了简化代码,想把一些相同的有功能的代码放在装饰器里,但是装饰器和内部函数间的切面将两者隔离开,因此需要在装饰器和内部函数上做一点小手脚,就可以达到目的:

import datetimeclass ca:    def __init__(self):        self.value='initial'        self.stat='ok'            def domethod(self):        self.value='changed'        self.stat='dump'        print 'The value is %s'%self.value        print 'The stat is %s'%self.stat        return self    def backhome(self):        self.value='initial'        print 'The value is back to %s'%self.value    def setok(self):        self.stat='ok'        print 'The stat is %s'%self.statdef dec(func):    def _dec(*a,**ka):        InOfa=ca()        targetargs=InOfa.domethod()        res=func(targetargs,*a,**ka)        res[0].setok()        return res[1]    return _dec@decdef thecorefunc(targetargs,date=datetime.date.today()):    print date    targetargs.backhome()    return (targetargs,date)if __name__=='__main__':    thecorefunc()

上面代码中的被装饰函数显而易见是thecorefunc,该函数在正常状况下的写法是不含有targetargs这个参数的,它就是需要在装饰器和函数间传递的变量(对象),在这个例子中,主体函数thecorefunc需要执行类ac的backhome方法,类ac的实例在运行时一定要先执行domethod方法,且结束时要执行setok方法,但又不想把这两个方法放在函数里,而是放在装饰器中,因此就将类ac的实例InOfa作为参数传入被装饰函数内,当被装饰函数运行后,再返回该实例,且和本身的返回值作为元祖一起返回。以待装饰器继续使用。

虽然打破了切面编程的这个切面,但也千万不要称其为黑魔法哦。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 退伍军人证和身份证名字不付怎么办 车辆有违章需要短信提醒要怎么办 1969年退伍的退伍证丢了怎么办 江苏移动没实名认证停机了怎么办呀 亿达老年手机来电音量太大怎么办 挑三十六乘二的内螺纹丝瞳毛怎么办 内六角螺丝的冒滑了怎么办 孔里的内六角滑了怎么办 十字螺丝刀的头卡在螺母里怎么办 内六角扳手断在螺丝孔里怎么办 六棱螺丝刀折进螺丝里了怎么办 内6棱螺丝拧花了怎么办 只有pe模式可以用键盘鼠标怎么办 电脑重做了系统连不上无线网怎么办 联想手机死机了怎么办不可拆卸电池 手机界面弹出后大小无法调整怎么办 方向盘打方向瑟瑟的吱吱响怎么办 三脚架提升杆螺丝滑丝了怎么办 花土里面有很多细长的螺丝怎么办 防盗门外边上边缝宽螺丝松了怎么办 填充墙与框架梁不对齐怎么办 亚轧滚珠丝杠螺帽超程了怎么办 在公司交的五险一金辞职了怎么办 铝合金的渣子整到眼睛里怎么办 铁锅手柄上的铆钉拧不动怎么办 喂完鱼鱼缸上边飘着一层油膜怎么办 铸铁管道横着排的结口漏水怎么办 缤智行李架免打孔螺丝款怎么办 前保险杠和叶子板缝隙大怎么办 新奥拓的大灯调节螺丝滑丝了怎么办 小米手环2计步不准怎么办 小米手环3计步不准怎么办 眼镜用洗发水洗了后模糊怎么办 雷朋近视镜眼镜腿折了怎么办 近视镜眼镜腿断了该怎么办 老师把学生的眼镜打坏了怎么办 生死狙击忘了密保改不了密码怎么办 我叫mt狂猎之弓怎么办 你能利用你的弱点打击你怎么办 研控两相混合伺服电机反转怎么办? 战地一要我升级显卡驱动怎么办