Python中的@修饰符
# -*- coding:utf-8 -*-
 
#      @修饰符的使用看起来很复杂,但是我们记住下面的原则,就很容易把@修饰符的使用规则理清楚了。
#      @dec2  
#      @dec1  
#      def func(arg1, arg2, ...):  
#          pass  
#
#      等同于:
#
#      def func(arg1, arg2, ...):  
#          pass  
#      func = dec2(dec1(func))
#
#      另外再说明一点,有了修饰符,便能使函数拥有了其它的一些执行环境,使函数可以在执行前先执行其它的一些前奏操作。    
#      下面我们结合几个例子解释一下用法。


print "The 1st example ############################"

def myFun(f):
    def wrap():
        print "setup ..."
        return f()
    return wrap
    
@myFun
def log():
    print "working ..."

#上述代码相当于 log = myFun(log),log函数整体作为参数传入。
#因为myFun(log函数)的调用返回函数wrap,这样,log便等于下面的函数:
#    def wrap():
#        print "setup ..."
#        return f()  #f是myFun函数的形参,log函数是作为参数传入myFun函数的,故这里f() = log()。
#
#所以log()调用便等于下面函数的调用:
#    def wrap():
#        print "setup ..."
#        return log()
#        
#请看下面的运行结果,        
log()



print "The 2nd example ############################"

def myFun(f):
    def wrap(*args, **kws):
        print "setup ..."
        return f(*args, **kws)
    return wrap
    
@myFun
def log(*args, **kws):
    print args
    print kws
    print "now"

#上述代码相当于 log = myFun(log),log函数整体作为参数传入。
#因为myFun(log函数)的调用返回函数wrap,这样,log便等于下面的函数:
#    def wrap(*args, **kws):
#        print "setup ..."
#        return f(*args, **kws) #f是myFun函数的形参,log函数是作为参数传入myFun函数的,故这里f(*args, **kws) = log(*args, **kws)。
#
#所以log(*args, **kws)调用便等于下面函数的调用:
#    def wrap(*args, **kws):
#        print "setup ..."
#        return log(*args, **kws)
#        
#请看下面的运行结果,    
log("start logging...")


print "The 3rd example ############################"

def fa(f):
    print 'fa'
    def fd(v1):
        print v1 + 'fd'
    return fd

def fb(f):
    print 'fb'
    return f

@fa
@fb
def fc(v2):
    print v2
#这里会输出:
#          fb
#          fa   
#上述代码相当于 fc = fa(fb(fc)),fc函数整体作为参数传入fb函数。
#整个函数调用过程是这样的:fb(fc))的调用,先print 'fb',然后返回函数fc,返回的fc函数又作为参数传给了fa函数,
#接着是fa(fc)调用,便先print 'fa',然后返回fd函数,所以此时的fc便等于下面的函数,
#    def fd(v1):
#        print v1 + 'fd'

#所以此时的fc(v)调用便等于下面函数的调用:
#    def fd(v):
#        print v + 'fd'
#        
#请看下面的运行结果,
fc('fc')
        

print "The 4th example ############################"

import time
 
def log(s):
  def wrapper1(f):
    def wrapper2(args):
        print "log arg: " + s
        print "start time: ", time.asctime()
        f(args)
        print "end time: ", time.asctime()

    return wrapper2
  return wrapper1

@log(s = "hello")
def worker(arg):
    print "working log: ", arg

#上述代码相当于 worker = log(s = "hello")(worker),
#整个函数调用过程是这样的:log(s = "hello")的调用,返回函数wrapper1,
#接着是wrapper1(worker)调用,然后返回wrapper2函数,但此时wrapper2已经拥有了外层函数的一些环境,
#即也能看到参数s和worker函数,
#所以此时的worker便等于下面的函数,
#    def wrapper2(args):
#        print "log arg: " + s  #s = "hello"
#        print "start time: ", time.asctime()
#        f(args) #worker(args)
#        print "end time: ", time.asctime()

#所以worker(arg)调用便等于下面函数的调用:
#    def wrapper2(args):
#        print "log arg: " + "hello"
#        print "start time: ", time.asctime()
#        worker(args)
#        print "end time: ", time.asctime()     
#请看下面的运行结果,     
worker("I'm working...")



读者可以复制上述整个段落放在python文件里运行,下面是上述python文件的运行结果:



     
相关课程
  • QTP(UFT)自动化测试课程

    ¥100元117人学习

  • 软件测试就业班全栈课程

    ¥6000元166人学习

  • 高级软件测试课程

    ¥5000元173人学习

  • 友情链接
  • 上海移动互联网产教研协同基地
  • 大唐邦彦