装饰器:对函数,方法,类进行加工处理, 为存在的对象添加额外的功能(插入日志,事务处理,性能统计)
1. 函数装饰器
import functools
def logger(func):
@functools.wraps(func) # 为了防止__name__、__doc__取值不正确
def wrapper(*args, **kwargs):
print func.__name__, 'called, arguments: ', args, kwargs
func(*args, **kwargs)
return wrapper
@logger
def foo():
print 'In foo()'
__closure__属性和cell对象: 装饰器本质上是一个闭包(closure),被他装饰的函数,__closure__属性不为None
foo.__closure__
foo.__closure__[0].cell_contents.func_name
2. 带参装饰器
def pre_str(pre=''):
def decorator(F):
def new_F(x, y):
print pre, 'input:', x, y
return F(x, y)
return new_F
return decorator
@pre_str(pre='^_^')
def square_sum(a, b):
return a**2 + b**2
@pre_str(pre='@_@')
def square_diff(a, b):
return a**2 - b**2
3. 类装饰器
def decorator(aClass):
class newClass:
def __init__(self, age):
self.total_display = 0
self.wrapped = aClass(age)
def dispaly(self):
self.total_display += 1
print 'total display:', self.total_display
self.wrapped.dispaly()
return newClass
@decorator
class Bird:
def __init__(self, age):
self.age = age
def display(self):
print 'my age is', self.age
enagleLord = Bird(3)
for i in range(5):
enagleLord.display()