python容許將方法看成參數傳遞
開放封閉原則
裝飾器是函數,只不過該函數能夠具備特殊的含義,裝飾器用來裝飾函數或類,使用裝飾器能夠在函數執行前和執行後添加相應操做。javascript
def wrapper(func): def result(): print 'before' func() print 'after' return result @wrapper def foo(): print 'foo'
def outer(func): def inner(*args,**kwargs): print("你蠻大爺我來了") print(kwargs) r = func(*args,**kwargs) print(kwargs) print("刀妹") return r return inner @outer def index(*args, **kwargs): print("安妮") return "lalal" index(1, **{"a":"b"})
#++++++++++++++++++++++++++++++++++ def outer_jia(func): def inner1(*args, **kwargs): print("懶輔助") r1 = func(*args, **kwargs) return r1 return inner1 def outer(func): def inner(*args,**kwargs): print("我是你蠻大爺") r = func(*args, **kwargs) print("我是你上單刀奶奶") return r return inner @outer_jia @outer def index(a1, a2): print("烈焰天使.彥") index(1,2)
import functools def wrapper(func): @functools.wraps(func) def wrapper(): print 'before' func() print 'after' return wrapper @wrapper def foo(): print 'foo'
#!/usr/bin/env python #coding:utf-8 def Before(request,kargs): print 'before' def After(request,kargs): print 'after' def Filter(before_func,after_func): def outer(main_func): def wrapper(request,kargs): before_result = before_func(request,kargs) if(before_result != None): return before_result; main_result = main_func(request,kargs) if(main_result != None): return main_result; after_result = after_func(request,kargs) if(after_result != None): return after_result; return wrapper return outer @Filter(Before, After) def Index(request,kargs): print 'index' if __name__ == '__main__': Index(1,2)
def decorator(args): def _deco(func): def _func(self): # 注意 self 是做爲參數傳進來的 self.i = args func(self) return _func return _deco class Foo(object): @decorator(123) def bar(self): # 輸出 123 print('i:', self.i) Foo().bar()
後續加入理解,暫未理解透徹java