裝飾器

 

裝飾器的內部實現原理

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'
View Code
#!/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)
View Code

 類裝飾器, 用裝飾圈修飾類

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

相關文章
相關標籤/搜索