装饰器实质还是一个函数,是对其他函数进行装饰的函数。装饰器函数接受被装饰函数的函数名,返回被装饰函数的函数名。对一个函数进行装饰有两个原则:一是不能修改被装饰函数的源代码;二是被装饰函数的调用方式不可以发生改变。

#用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再议装饰器相关推荐

  1. python生成器和装饰器_python三大法器:生成器、装饰器、迭代器

    迭代器 迭代的概念 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程 使用for循环遍历取值的对象叫做可迭代对象, 比如:列表.元组.字典.集合.range.字符串 判断 ...

  2. python类装饰器详解-python 中的装饰器详解

    装饰器 闭包 闭包简单的来说就是一个函数,在该函数内部再定义一个函数,并且这个内部函数用到了外部变量(即是外部函数的参数),最终这个函数返回内部函数的引用,这就是闭包. def decorator(p ...

  3. python中的装饰器decorator

    python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x):return ...

  4. python生成器和装饰器_python之yield与装饰器

    防伪码:忘情公子著 python中的yield: 在之前发布的<python之列表解析与生成器>中我们有提到过,生成器所实现的是跟列表解析近似的效果,但是我们不能对生成器做一些属于列表解析 ...

  5. Python闭包与装饰器

    Python闭包与装饰器 一.闭包       函数是一个对象,所以可以对象的形式作为某个函数的结果返回.函数执行完后内部变量将会被回收.在闭包中,由于内部函数存在对外部函数的变量的引用,所以即使外部 ...

  6. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

  7. python中的装饰器怎么运行_Python 装饰器入门(上)

    翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...

  8. 一文搞懂Python知识难点------装饰器

    1.装饰器的本质 装饰器本质上是一个闭包函数,可以让其它函数在不需要任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数. 闭包函数 1)必须是嵌套函数,即外函数中定义了一个内函数: 2)内函 ...

  9. python decorator. decorator_Python 装饰器Decorator(一)

    (一) 装饰器基础知识 什么是Python装饰器?Python里装饰器是一个可调用的对象(函数),其参数是另一个函数(被装饰的函数) 假如有一个名字为somedecorator的装饰器,target是 ...

  10. python装饰器 property_介绍Python的@property装饰器的用法

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...

最新文章

  1. Django Request对象3.3
  2. 根据矩阵变化实现基于 HTML5 的 WebGL 3D 自动布局
  3. 探究platform_driver中“多态”思想
  4. #3456. 城市规划(生成函数,多项式求逆)
  5. 鸿蒙系统8月9日发布,8月9日,华为发布EMUI10.0系统+展示鸿蒙系统
  6. mp4 拍摄时间如何看_时间不多了,如何备考期末最有效?这些复习技巧,看了你就会了...
  7. 详解:设计模式之-单例设计模式
  8. Luogu 3267 [JLOI2016/SHOI2016]侦察守卫
  9. 单片机ADC采样算法----中位值平均滤波法
  10. 2021年SWPUACM暑假集训day5单调栈算法
  11. Android音频框架笔记 - 下篇
  12. SD卡的详细资料(开发文档)
  13. Nero刻录软件 nero8序列号
  14. NexT主题配置优化-出土指南
  15. 会计信息质量可靠性的案例_论会计信息质量特征及其可靠性
  16. jenkins如何清缓存,jenkins在结账前清除存储库并强制克隆与清理
  17. pip install使用豆瓣库
  18. aws lambda_借助AWS Elastic Beanstalk轻松进行Spring Boot部署
  19. kettle 9.x 版本连接资源库,资源库灰色
  20. 打印显示服务器脱机win10,win10网络打印机脱机怎么办?

热门文章

  1. sql打印每年入职人数_2015年3D打印基础知识-拥有16年全职经验的人
  2. 惋惜!杭州互联网公司22岁女孩猝死!某大厂家属怒喷996的工作方式...
  3. FPGA Verilog 编写的 可调时 数字钟
  4. gps网络对时Linux,GPS 网络对时设置 详细版.doc
  5. 使用Xbox360手柄控制你的turtlebot/rbx1/mrobot小车机器人
  6. 3par linux多路径软件,Redhat6.X 配置HP3PAR7200存储多路径过程
  7. 【考研政治】1. 导论和基本哲学问题
  8. 使用批处理实现分组多用户的创建和权限分配
  9. 100m光纤测速多少正常_100M的光纤电信宽带,用手机测速时,为什么只有40M?
  10. 操作系统实验: 进程管理