主題: decorator的等價寫法
class A(object):
@property
def func(self):
...
同
class A(object):
def func(self):
...
func = property(func)
換句話說這時候 func經過property之後
1. 從單純的func變成為property
2. func則變為 class variable (不是intance variable)
<pre class='codeblock'>#!/usr/bin/python
import time
from functools import wraps
def timethis(func):
'''
Decorator that reports the excution time
'''
#@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__, end-start)
return result
return wrapper
@timethis
def countdown(n):
'''
Counts down
'''
while n > 0:
n -= 1
countdown(10000)
print countdown.__name__
print countdown.__doc__
<\pre>
#!/usr/bin/python3
from functools import wraps, partial
import logging
def logged(level, name=None, message=None):
print ("%r %s" % (locals(), "0"))
def decorate(func):
logname = name if name else func.__module__
log = logging.getLogger(logname)
logmsg = message if message else func.__name__
print ("%r %s" % (locals(), "1"))
@wraps(func)
def wrapper(*args, **kwargs):
print ("%r %s" % (locals(), "2"))
log.log(level, logmsg)
return func(*args, **kwargs)
return wrapper
return decorate
@logged(logging.DEBUG)
def add(x, y):
return x + y
注意,一樣add並沒有被呼叫, 但結果如下: