python 装饰器学习(decorator)

Posted 圣诞使者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 装饰器学习(decorator)相关的知识,希望对你有一定的参考价值。

最近看到有个装饰器的例子,没看懂,

#!/usr/bin/python
class decorator(object):
    def __init__(self,f):
        print "initial decorator"
        f()
    def __call__(self):
        print "call decorator"
@decorator
def fun():
    print "in the fun"
print "after "
fun()

从stackoverflow看到了浏览最多的关于python装饰器的文章,下面是这个文章的网址

http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python/1594484#1594484

感觉写的挺好的,我自己也总结总结。

问题是lz想写个装饰器:

@makebold
@makeitalic
def say():
   return "Hello"

有这样的输出:

"<b><i>Hello</i></b>"

看到最短的回复是:

def makebold(f): 
    return lambda: "<b>" + f() + "</b>"
def makeitalic(f): 
    return lambda: "<i>" + f() + "</i>"

@makebold
@makeitalic
def say():
    return "Hello"

print say()

太经典了,

最开始的例子,先写段代码:

#de 就代表decorator吧,简单些O(∩_∩)O~,
def de(f):
def wr():
print "before func"
f()
print "after func"
return wr

def func():
print "this is func self"
#先运行一遍代码
func()
#装饰函数
de_func=de(func)
#运行装饰了之后的函数
de_func()
#或者
#装饰函数
func=de(func)
#运行装饰了之后的函数
func()
#或者
de(func)()

还有一处需要理解的就是类的__call__方法是在instance=classname()()(也可以写成instance=classname();instance())的时候调用的

python 自己的装饰器就是:

#还可以在函数定义之前加上@de
@de
def func1():
    print "**this is func self"
func1()

理解了上面之后文章开头的例子也可以写成这样

class decorator(object):
    def __init__(self,f):
        print "initial decorator"
        f()
    def __call__(self):
        print "call decorator"
# @decorator
def fun():
    print "in the fun"
fun=decorator(fun)
print "after "
fun()

有仔细看了那篇文章,感觉受益匪浅,也是自己当初学的时候没好好听吧。

       

 

以上是关于python 装饰器学习(decorator)的主要内容,如果未能解决你的问题,请参考以下文章

Python学习笔记012——装饰器

python之装饰器(decorator)

Python进阶装饰器(Decorator)

python--decorator装饰器

Python - 装饰器

Python 终结者 - 装饰器,也叫 Decorator