装饰器的本质:

当你在用某个@decorator来修饰某个函数func时,如下所示:

@decorator

def func():

pass

其解释器会解释成下面这样的语句:

func=decorator(func)

本质是把一个函数当作参数传递到另一个函数中,然后再调用。

def hello(fn):

def wrapper():

print "hello,%s" %fn.__name__

fn()

print "goodbye,%s" %fn.__name__

return wrapper

@hello

def foo():

print "I am foo"

>>>foo()

"hello,foo"

"I am foo"

"goodbye,foo"

hello(foo)返回了wrapper()函数,所以foo其实变成了wrapper的一个变量,而后面的foo()执行其实变成了wrapper()

多个装饰器:

@decorator_one

@decorator_two

def func():

pass

相当于func=decorator_one(decorator_two(func))

带参数的装饰器:

@decorator(arg1,arg2)

def func():

pass

相当于func=decorator(arg1,arg2)(func).这意味着decorator(arg1,arg2)这个函数需要返回一个“真正的装饰器”。

def mydecorator(arg1,arg2):

def _mydecorator1(func):

def _mydecorator2(*args,**kw):

res=func(*args,**kw)

return res

return _mydecorator2

return _mydecorator1

上面的函数返回的_mydecorator1才是真正的装饰器。因此,当装饰器需要参数时,必须使用第二集封装。因为装饰器在模块第一次被读取时由解释程序装入,所以它们的使用必须受限于总体上可以应用的封装器。

带参数及多个装饰器:

def makeHtmlTag(tag,*args,**kwds):

def real_decorator(fn):

css_class="class=‘{0}‘".format(kwds["css_class"]) if "css_class" in kwds else ""

def wrapped(*args,**kwds):

return ""+fn(*args,**kwds)+""+tag+">"

return warpped(*args,**kwds)

return real_decorator

@makeHtmlTag(tag=‘i‘,css_class=‘italic_css‘)

@makeHtmlTag(tag=‘b‘,css_class=‘bold_css‘)

def hello():

return "hello world"

>>>hello()

hello world

class式装饰器:

class mydecorator(object):

def __init__(self,fn):

print "inside mydecorator--init"

self.fn=fn

def __call__(self):

self.fn()

print "inside mydecorator--call"

@mydecorator

def myfunc():

print "inside myfunc"

>>>myfunc

"inside mydecorator--init"

"inside myfunc"

"inside mydecorator--call"

重写makeHtmlTag代码:

原文:http://my.oschina.net/935572630/blog/393489

python重写和装饰器_python中的装饰器相关推荐

  1. python中修饰器_python 中的修饰器

    参考文章 @property和@ .setter的用法: @property 把属性装饰成get方法 给属性赋值时,会自动调用@property装饰的方法 只设置属性的@property 时,属性为只 ...

  2. python获取方法的装饰方法_python中的方法和装饰器

    [TOC] 装饰器 python中的装饰器(decorator)是在pep 318中被首次引入,它的本质是一个函数这个函数是接受其它参数为参数,并且用一个新的,修改后的函数作为替换,最常见的装饰器就c ...

  3. python装饰器 property_Python中@property装饰器的使用技巧性解析(代码示例)

    Python中@property装饰器的技巧性用法(代码示例) 本篇文章给大家带来的内容是关于Python中@property装饰器的技巧性用法(代码示例),有一定的参考价值,有需要的朋友可以参考一下 ...

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

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

  5. python grpc unary call错误_python的黑魔法-装饰器

    python的装饰器 装饰器 简单的来说就是函数的函数,在执行目标函数时,先执行装饰器函数,很像HOOk 简单的装饰器 实现一个打印日志的装饰器 def myLogger(func):def wrap ...

  6. python什么是装饰器_python学习之装饰器是什么?

    学完python函数,接下来我们跟着猿人学python一起来看看什么是装饰器. 大家应该多多少少在其它地方有看过或是听过"装饰器"这个词.装饰器,顾名思义,就是用来装饰的,它装饰的 ...

  7. python迭代是什么意思_python中什么是迭代?

    python中什么是闭包? *Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西. 闭包的概念 我们尝试从概念上去理解一下闭包. 在一些语言中, ...

  8. python的网页解析器_python 之网页解析器

    一.什么是网页解析器 1.网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出& ...

  9. python自带网页解析器_python 之网页解析器

    一.什么是网页解析器 1.网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出& ...

最新文章

  1. tcp拥塞控制编程实验c语言代码,C语言 计算机网络TCP拥塞控制模拟程序
  2. 国科大回应:博士生每月不低于4300元!
  3. 学习笔记TF064:TensorFlow Kubernetes
  4. python程序设计教材浅显易懂_这些python自学技巧,你不会?
  5. 微信小程序---系统信息-位置信息-定位信息
  6. java核心编程视频教学
  7. pandas将字典转换成dataframe,两重字典
  8. C++友元函数和友元类(三)
  9. IdHttpServer实现webservice
  10. 突发!Spring 也沦陷了。。。
  11. Android PackageManagerService分析三:卸载APK
  12. 编译libxcb时报错:No package 'xcb-proto' found
  13. 【numpy学习】numpy教程--基于莫烦python的教程
  14. 安卓系统如何访问wincc服务器,wincc客户端读取服务器数据库
  15. 轻松实现页面提交时,显示“提交中..”
  16. C# WPF MVVM 实战 - 1
  17. android获取sdcard文件,android读取SDCard任意路径下的文件
  18. PHP输出图像imagegif、imagejpeg与imagepng函数用法
  19. Luogu 1315 【NOIP2011】观光公交 (贪心)
  20. Java工具类库Hutool,GitHub星标15k+

热门文章

  1. Php超出高度隐藏,swiper滑屏中某一页超出高度解决方法
  2. 文房四宝用计算机取代的什么,《文房四宝》阅读练习及答案
  3. Most socially-distanced subsequence CodeForces - 1364B(贪心)
  4. [HAOI2015]树上染色(树形dp,树形背包)
  5. php mysql无限_php+mysql实现无限分类实例详解
  6. linux的技术点,给你的Linux系统上点stress
  7. mysql5717开发设置怎么调回来_华为手机这几个默认设置,一定要关闭,再也不卡顿...
  8. java判断实例_java判断类和实例的关系
  9. python的线程组怎么写_Python学习——Python线程
  10. oracle+标记要,oracle ORA-00031:session marked for kill(标记要终止的会话)解决方法