python再议装饰器
装饰器实质还是一个函数,是对其他函数进行装饰的函数。装饰器函数接受被装饰函数的函数名,返回被装饰函数的函数名。对一个函数进行装饰有两个原则:一是不能修改被装饰函数的源代码;二是被装饰函数的调用方式不可以发生改变。
#用dec()函数对poem()函数进行装饰,但是调用方式由poem()变成了name(), #调用方式发生了改变...这违反写装饰器的第二个原则。解决办法:把name= #deco(poem)这一句的name改成poem.即:name=deco(name),见下一段代码。 def deco(func): #接收一个函数名,返回相同的函数名print('古诗欣赏') #添加装饰语句return func def poem():print('月落乌啼霜满天,江枫渔火对愁眠。') name = deco(poem) #传进去函数名poem,再把返回的函数名poem赋给name name() #装饰之后,再调用被装饰函数 ''' 古诗欣赏 月落乌啼霜满天,江枫渔火对愁眠。 '''
View Code
#用dec()函数对poem()函数进行装饰,但是调用方式由poem()变成了name(), #调用方式发生了改变...这违反写装饰器的第二个原则。解决办法:把name= #deco(poem)这一句的name改成poem.即:name=deco(name),见下一段代码。 def deco(func): #接收一个函数名,返回相同的函数名print('古诗欣赏') #添加装饰语句return func def poem():print('月落乌啼霜满天,江枫渔火对愁眠。') poem = deco(poem) #传进去函数名poem,再把返回的函数名poem赋给name poem() #装饰之后,再调用被装饰函数 ''' 古诗欣赏 月落乌啼霜满天,江枫渔火对愁眠。 '''
View Code
写带有@的装饰语句 :
def deco(func): #接收一个函数名,返回相同的函数名print('古诗欣赏') #装饰语句return func @deco #在被装饰的函数的头顶写装饰语句,相当于poem = deco(poem) def poem():print('月落乌啼霜满天,江枫渔火对愁眠。') #poem = deco(poem) #传进去函数名poem,再把返回的函数名poem赋给name poem() #装饰之后,再调用被装饰函数 ''' 古诗欣赏 月落乌啼霜满天,江枫渔火对愁眠。 '''
View Code
一般要把装饰器写成嵌套函数:
#对无参数的函数进行装饰 def guess_win(func): #传进去一个函数名german_team,返回一个函数名rooftop_statusdef rooftop_status():result = func() #相当于result=german_team()print('天台已满,请排队!')return result #处理被装饰的函数german_team(),然后返回处理后的结果return rooftop_status #执行完这句后,把新定义的函数名rooftop_status返回给german_team:#german_team=rooftop_status @guess_win #这句话相当于german_team=guess_win(gernam_team) def german_team():print('德国必胜!')return '赢了会所嫩模!输了下海干活!' x = german_team() #由于return rooftop_status的作用是:german_team=rooftop_status print(x) ''' 德国必胜! 天台已满,请排队! 赢了会所嫩模!输了下海干活! '''
View Code
#对带参数的函数进行装饰 def guess_win(func): #传进去一个函数名german_team,返回一个函数名rooftop_statusdef rooftop_status(*args, **kwargs):result = func(*args, **kwargs)print('天台已满,请排队!')return resultreturn rooftop_status #执行完这句后,把新定义的函数名rooftop_status返回给german_team:#german_team=rooftop_status @guess_win #这句话相当于german_team=guess_win(gernam_team),调用guess_win()函数 def german_team(arg):print('%s必胜!'% arg)return '德国赢了会所嫩模!输了下海干活!' @guess_win #这句话相当于spain_team=guess_win(spain_team),调用guess_win()函数 def spain_team(arg):print('%s必胜!'% arg)return '西班牙赢了会所嫩模!输了下海干活!' x = german_team('德国') y = spain_team('西班牙') print(x) print(y) ''' 德国必胜! 天台已满,请排队! 西班牙必胜! 天台已满,请排队! 德国赢了会所嫩模!输了下海干活! 西班牙赢了会所嫩模!输了下海干活! '''
View Code
def decorator(F):def new_F(a, b):print("input", a, b)return F(a, b)return new_F @decorator #相当于:square_sum=decorator(square_sum) def square_sum(a, b):return a**2 + b**2 @decorator def square_diff(a, b):return a**2 - b**2print(square_sum(4, 3))#相当于: # square_sum = decorator(square_sum) # square_sum(3, 4) print(square_diff(4, 3)) ''' input 4 3 25 input 4 3 7 '''
View Code
转载于:https://www.cnblogs.com/yibeimingyue/p/9381622.html
python再议装饰器相关推荐
- python生成器和装饰器_python三大法器:生成器、装饰器、迭代器
迭代器 迭代的概念 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程 使用for循环遍历取值的对象叫做可迭代对象, 比如:列表.元组.字典.集合.range.字符串 判断 ...
- python类装饰器详解-python 中的装饰器详解
装饰器 闭包 闭包简单的来说就是一个函数,在该函数内部再定义一个函数,并且这个内部函数用到了外部变量(即是外部函数的参数),最终这个函数返回内部函数的引用,这就是闭包. def decorator(p ...
- python中的装饰器decorator
python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x):return ...
- python生成器和装饰器_python之yield与装饰器
防伪码:忘情公子著 python中的yield: 在之前发布的<python之列表解析与生成器>中我们有提到过,生成器所实现的是跟列表解析近似的效果,但是我们不能对生成器做一些属于列表解析 ...
- Python闭包与装饰器
Python闭包与装饰器 一.闭包 函数是一个对象,所以可以对象的形式作为某个函数的结果返回.函数执行完后内部变量将会被回收.在闭包中,由于内部函数存在对外部函数的变量的引用,所以即使外部 ...
- python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上
Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...
- python中的装饰器怎么运行_Python 装饰器入门(上)
翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...
- 一文搞懂Python知识难点------装饰器
1.装饰器的本质 装饰器本质上是一个闭包函数,可以让其它函数在不需要任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数. 闭包函数 1)必须是嵌套函数,即外函数中定义了一个内函数: 2)内函 ...
- python decorator. decorator_Python 装饰器Decorator(一)
(一) 装饰器基础知识 什么是Python装饰器?Python里装饰器是一个可调用的对象(函数),其参数是另一个函数(被装饰的函数) 假如有一个名字为somedecorator的装饰器,target是 ...
- python装饰器 property_介绍Python的@property装饰器的用法
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...
最新文章
- Django Request对象3.3
- 根据矩阵变化实现基于 HTML5 的 WebGL 3D 自动布局
- 探究platform_driver中“多态”思想
- #3456. 城市规划(生成函数,多项式求逆)
- 鸿蒙系统8月9日发布,8月9日,华为发布EMUI10.0系统+展示鸿蒙系统
- mp4 拍摄时间如何看_时间不多了,如何备考期末最有效?这些复习技巧,看了你就会了...
- 详解:设计模式之-单例设计模式
- Luogu 3267 [JLOI2016/SHOI2016]侦察守卫
- 单片机ADC采样算法----中位值平均滤波法
- 2021年SWPUACM暑假集训day5单调栈算法
- Android音频框架笔记 - 下篇
- SD卡的详细资料(开发文档)
- Nero刻录软件 nero8序列号
- NexT主题配置优化-出土指南
- 会计信息质量可靠性的案例_论会计信息质量特征及其可靠性
- jenkins如何清缓存,jenkins在结账前清除存储库并强制克隆与清理
- pip install使用豆瓣库
- aws lambda_借助AWS Elastic Beanstalk轻松进行Spring Boot部署
- kettle 9.x 版本连接资源库,资源库灰色
- 打印显示服务器脱机win10,win10网络打印机脱机怎么办?
热门文章
- sql打印每年入职人数_2015年3D打印基础知识-拥有16年全职经验的人
- 惋惜!杭州互联网公司22岁女孩猝死!某大厂家属怒喷996的工作方式...
- FPGA Verilog 编写的 可调时 数字钟
- gps网络对时Linux,GPS 网络对时设置 详细版.doc
- 使用Xbox360手柄控制你的turtlebot/rbx1/mrobot小车机器人
- 3par linux多路径软件,Redhat6.X 配置HP3PAR7200存储多路径过程
- 【考研政治】1. 导论和基本哲学问题
- 使用批处理实现分组多用户的创建和权限分配
- 100m光纤测速多少正常_100M的光纤电信宽带,用手机测速时,为什么只有40M?
- 操作系统实验: 进程管理