<
decorator
Table of Contents
1 decorator
python中的装饰模式器其实就是对函数进行修改,符号为@
1.1 python中函数可以作为返回值
def newFunc(): return lambda x: x*x func = newFunc() print(func(3))
1.2 函数作为入参
def alterFunc(func): print('this func is altered ', func.__name__) return lambda x: x+1 def myFunc(x): return x*x myFunc = alterFunc(myFunc) print(myFunc(5))
1.3 改写函数
def logFunc(func): print('this func is loged ', func.__name__) def wrapper(*args): print('%s is called' % func.__name__) # args是一个tuple, *args是把tuple展开后作为函数入参 result = func(*args) print('result is ', result) return result return wrapper def myFunc(x): return x*x myFunc = logFunc(myFunc) print(myFunc(6))
1.4 装饰器改写
def logFunc(func): print('this func is loged ', func.__name__) def wrapper(*args): print('%s is called' % func.__name__) # args是一个tuple, *args是把tuple展开后作为函数入参 result = func(*args) print('result is ', result) return result return wrapper @logFunc def myFunc(x): return x*x # 和上面等价的 # def myFunc(x): # return x*x # myFunc = logFunc(myFunc) print(myFunc(6))
1.5 装饰器可以为一个类
class classDecor: def __init__(self, func): print('init ') self.func = func def __call__(self, args): print('called ', args) result = self.func(args) print('called over') return result @classDecor def myFunc2(x): return x*x print(myFunc2(5))
1.6 类也可以使用装饰器
def addFunc(cls): def f1(self, x, y): return min(x, x+y) cls.f = f1 return cls @addFunc class C: def g(self): return 'hello world' c = C() print(c.g(), c.f(3, 2))
1.7 类装饰器改写类
class clsFunc: def __init__(self, cls): print 'try wrap class' class wrapperCls(cls): def f1(self, x, y): return min(x, x+y) self.obj = wrapperCls() def __call__(self): print('clsFunc.__call__ called') return self.obj # in decorator, it will call clsFunc.__init__ to wrap class @clsFunc class D: def g(self): return 'hello world' print('in init obj, it will call clsFunc.__call__') d = D() print('in calling funcs') print(d.g(), d.f1(3, 2))
Date: 2013-04-15 16:03:48 中国标准时间