python和javascript类似, 可以把函数当作函数的返回值, 比如

def func(f):

def subfunc():

print 'subfunc'

return subfunc此外func的参数f也可以是一个函数,正是这样的结构让python可以实现装饰器模式

def deco(func):

print("before myfunc() called.")

func()

print("  after myfunc() called.")

return func

def myfunc():

print(" myfunc() called.")

myfunc = deco(myfunc)

myfunc()可以看到myfunc被deco包装了一下,在执行前的切面和执行后的切面都增加了一段代码,这就是装饰器的作用.

在python中还有一个语法糖的概念, 有了它装饰器模式的实现代码可以更加简洁.示意如下:

def deco(func):

print("before myfunc() called.")

func()

print("after myfunc() called.")

return func

@deco

def myfunc():

print("myfunc() called.")

myfunc()

myfunc()

把装饰函数的名字和@符号,放到被装饰函数的上一行,python就会自动开启装饰器模式.

但是语法糖有一个问题要注意.语法糖对函数的包装只会在编译代码时进行一次.也就是说在编译的时候,python会自动执行:

myfunc = deco(myfunc)

所以如果你运行上面这段代码, 编译时会输出:

before myfunc() called.

myfunc() called.

after myfunc() called.

运行最后两个myfunc()时,又会输出:

myfunc() called.

myfunc() called.

也就是这篇文章第三步中提到的运行结果.正确的方法是定义一个函数,用这个函数作为返回值代替被装饰的函数.

def deco(func):

def _deco():

print("before myfunc() called.")

func()

print("after myfunc() called.")

return _deco

@deco

def myfunc():

print(" myfunc() called.")

return 0

myfunc()

myfunc()

一个函数可以被多个装饰函数包装, 比如语法糖的顺序是

@deco_1

@deco_2

def func()

pass那么装饰的顺序就是:

func =deco_1(deco_2(func))

此外装饰器还可以带参数, 在这种情况下装饰函数就会再多一层函数嵌套:

def deco(arg):

def _deco(func):

def wrapper():

#begin warpping

func()

#end warpping

return wrapper

return _deco

@deco(1)

func()为什么呢? 因为包装过程是:

func = deco(1)(func)deco是一个带参数的函数, 而deco(arg)的返回值又是一个以函数为参数的"正常的"装饰函数. 而这个"正常的"装饰函数的返回值又是一个用来代替func()的已经包装好了的函数.

此外被装饰的函数也可以带参数, 装饰函数的参数还可以是一个类 等等, 我就不一一举例了,大家可以看看这几篇文章:

http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html

http://www.cnblogs.com/wilber2013/p/4657155.html

python装饰器模式带参数_python 装饰器模式 我的理解相关推荐

  1. python装饰器模式带参数_Python装饰器使用实例:验证参数合法性 请教Python 使用装饰器实现单例模式的原理...

    python中一层装饰器的函数可以带参数吗 可以的, 装饰器分为可带参数和不可带参数的两种:但是如果带参数,则带参数装饰器的"参数"及"return"必须也是一 ...

  2. python装饰器模式带参数_Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)...

    Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...

  3. python装饰器模式带参数_python函数装饰器、类装饰器和带参数的装饰器——装饰器模式...

    装饰器模式: 动态地给对象添加一些额外的职责,就增加功能来说,装饰模式比生产子类更加灵活 Component 是定义一个对象接口,可以给这些对象动态地添加职责.concreteComponent是定义 ...

  4. Python:闭包(简介、使用方法、nonlocal修改闭包内使用的外部变量)、装饰器(定义、作用、通用装饰器、多个装饰器、带参数的装饰器、类装饰器、装饰器方式添加WEB框架的路由)

    一.闭包的介绍 闭包可以保存函数内的变量 当闭包执行完毕,外部函数的变量才释放. # 闭包的作用:可以保存外部函数的变量 # 闭包的形成条件 # 1.函数嵌套 # 2.内部函数使用了外部函数的变量或者 ...

  5. 4-2日装饰器,带参数的装饰器

    1,函数的有用信息 from functools import wraps#引用模块 def wrapper(f): # f = func1 @wraps(f)def inner(*args,**kw ...

  6. python带参数的装饰器的作用_Python带参数的装饰器运行原理解析

    关于装饰器的理解,特别像<盗梦空间>中的进入梦境和从梦境出来的过程,一层一层的深入梦境,然后又一层一层的返回,被带入梦境的是被装饰的函数,装饰器就是使人入梦的工具. 上代码: from f ...

  7. python 装饰器 参数-python函数装饰器之带参数的函数和带参数的装饰器用法示例...

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  8. python 装饰器 参数-[Python]写个带参数的装饰器

    上篇文章 Python装饰器为什么难理解?从函数到装饰器一步一步介绍了Python装饰器的来由,不知你对装饰器理解了没有,强烈建议你自己动手写个装饰器应用到项目中加深理解.装饰器可以很简单,也可以很复 ...

  9. python装饰器函数-python函数装饰器之带参数的函数和带参数的装饰器用法示例

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

最新文章

  1. 洛谷 P1966 火柴排队
  2. 探索ArrayList自动改变size真相
  3. Linux命令学习(三):文件操作命令(1)
  4. 腾讯优图提出LCVR-MQVI算法,勇夺NTIRE 2021双赛道冠亚军
  5. 全球移动支付发展现状移动支付之综述篇
  6. Linux中hosts文件的修改
  7. 计算机二级vb考试题库app,全国计算机二级vb考试题库
  8. 一个div在另一个div里垂直居中显示
  9. 魔兽世界用宏显示服务器时间,魔兽世界宏命令全表
  10. Win7系统无法被远程桌面连接如何解决
  11. 信号复数及希尔伯特变换的理解
  12. Python学习:使用pycharm运行py文件报错系统找不到指定的路径
  13. 计算机视觉(三)图像拼接
  14. php公益培训,周日晚上听seo的课,yy88354001
  15. 艾司博讯:拼多多诱导非官方交易怎么处理?
  16. 磁盘最优存储问题---Python
  17. PYTHON模块搜索路径
  18. 四、Transforms
  19. 反爬虫,看看互联网大厂是怎么玩的?
  20. SQL85 实习广场投递简历分析(二)

热门文章

  1. passed into methods by value java专题
  2. CCNA 学习笔记(七)--交换知识(VLAN VTP TRUNK)
  3. 优酷的多页画在同一窗口打开效果。
  4. 内网信息安全厂商对客户的误导
  5. Pandas数据帧(DataFrame)
  6. js 改变this指向的几种方法(个人学习笔记)
  7. hdu-2032杨辉三角
  8. 社会对IT 从业人员综合素质的需求
  9. Redis在Windows下设置服务启动
  10. php 错误500排错,如何排查Web服务器HTTP ERROR 500的错误?