@ python的修饰符
2009-01-08 00:10 ubunoon 阅读(7093) 评论(0) 编辑 收藏 举报
@符号在python语言中具有特殊含义,用来作为修饰符使用。
具体可以参考下面的代码:
从中可以看到,在tcfunc外部的函数对象与wrappedFunc的函数对象是同一个对象,在tcfunc内部参数func中调用的
才是实际定义的foo函数对象!!!
具体可以参考下面的代码:
#! /usr/bin/env python
#coding=utf-8
from time import ctime, sleep
def tcfunc(func):
def wrappedFunc():
print '[%s] %s() called' %(
ctime(), func)
return func()
print "in tcfunc called"
print "wrapped func %s" %wrappedFunc
return wrappedFunc
# decorator 仅调用tcfunc函数,该函数将foo作为一个参数,返回一个
# wrappedFunc函数对象,用该对象来取代foo函数在外部的调用,foo
# 定义的函数只能够在内部进行调用,外部无法获取其调用方式!!
@tcfunc # call sequence is : tcfunc(func) --> wrappedFunc -- > func
def foo():
print "in foo called"
pass
print "foo func : %s" %foo
foo()
print "-"*100
sleep(4)
for i in range(2):
sleep(i)
foo()
print "-"*100
上面函数中,tcfunc定义了一个函数,里面内嵌一个函数,该函数需要一个func的参数。
@tcfunc则表示下面定义的函数将函数名作为tcfunc的参数被tcfunc调用。
代码:
in tcfunc called
wrapped func <function wrappedFunc at 0x01A3DD30>
foo func : <function wrappedFunc at 0x01A3DD30>
[Thu Jan 08 00:04:35 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------
[Thu Jan 08 00:04:39 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------
[Thu Jan 08 00:04:40 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------
#coding=utf-8
from time import ctime, sleep
def tcfunc(func):
def wrappedFunc():
print '[%s] %s() called' %(
ctime(), func)
return func()
print "in tcfunc called"
print "wrapped func %s" %wrappedFunc
return wrappedFunc
# decorator 仅调用tcfunc函数,该函数将foo作为一个参数,返回一个
# wrappedFunc函数对象,用该对象来取代foo函数在外部的调用,foo
# 定义的函数只能够在内部进行调用,外部无法获取其调用方式!!
@tcfunc # call sequence is : tcfunc(func) --> wrappedFunc -- > func
def foo():
print "in foo called"
pass
print "foo func : %s" %foo
foo()
print "-"*100
sleep(4)
for i in range(2):
sleep(i)
foo()
print "-"*100
上面函数中,tcfunc定义了一个函数,里面内嵌一个函数,该函数需要一个func的参数。
@tcfunc则表示下面定义的函数将函数名作为tcfunc的参数被tcfunc调用。
代码:
@tcfunc
def foo():
pass
在定义的时候,就被tcfunc调用,即tcfunc(foo),该函数返回一个wrappedFunc对象,而该定义foo函数名对象其实已经被wrappedFunc对象给取代, foo()定义的函数只在tcfunc函数内部作为参数被使用!我们可以通过打印它们的地址来查看tcfunc外部调用的foo与wrappedFunc是否为同一个对象:def foo():
pass
in tcfunc called
wrapped func <function wrappedFunc at 0x01A3DD30>
foo func : <function wrappedFunc at 0x01A3DD30>
[Thu Jan 08 00:04:35 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------
[Thu Jan 08 00:04:39 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------
[Thu Jan 08 00:04:40 2009] <function foo at 0x01A3DCF0>() called
in foo called
----------------------------------------------------------------------------------------------------
从中可以看到,在tcfunc外部的函数对象与wrappedFunc的函数对象是同一个对象,在tcfunc内部参数func中调用的
才是实际定义的foo函数对象!!!
/*
*
* Copyright (c) 2011 Ubunoon.
* All rights reserved.
*
* email: netubu#gmail.com replace '#' to '@'
* http://www.cnblogs.com/ubunoon
* 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
* 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */
*
* Copyright (c) 2011 Ubunoon.
* All rights reserved.
*
* email: netubu#gmail.com replace '#' to '@'
* http://www.cnblogs.com/ubunoon
* 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
* 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */