python装饰器

来源:互联网 发布:网络很火丑男图片 编辑:程序博客网 时间:2024/06/07 07:23

def  Fun(func):

def  fun1():

print 'hello'       #此处可以加一些条件判断之类的代码,用来限制fun2的执行

   return  func    #标记一

return fun1   #作为装饰器,此处调用fun1()不需要加'( )',就可以运行,如果加了'( )',则是将'( )'传递给了fun1的返回值func


@Fun

def fun2():

print 'world'

此时调用fun2应为

fun2()()  这样才会运行,第二个'()',是用来传递给fun1的返回值func的,如果不加,则不会执行fun2内的代码

我们知道,装饰器的作用是当调用fun2时,既代码:fun2()   此时先将fun2传入到Fun中去,既执行代码:Fun(fun2)  此时fun1的返回值并没有得到‘( )’故不会执行fun2,(如果没哟加装装饰器,要执行相同装饰器效果可以写代码:Fun(fun2)()())

为了简化可以将标志一处代码改为:return func()  避免多加'( )'的麻烦


如果被装饰的函数有参数:

def Fun(func):
    #*args表示元祖参数,**kargs表示字典参数
    def fun1(*args,**kargs):
        printf('hello world')
        return func(*args,**kargs)
    return fun1


装饰器带参数

def Fun(arg):        #装饰器此时的参数并不是用来接收函数的,而是接收装饰器的变量

          def   fun2(func):           #第一层 接受函数

                  def  fun3():         

                          print   'hello'

                          print   arg

                           func()           #注意此时并无返回值

                 return   fun3          #虽然fun3无返回值,但仍然要return  fun3

          return   fun2    #返回fun2

@Fun('test')

def  fun1():

         print  'world'

fun1()

结果为:

hello

test

world

原创粉丝点击