2012-01-11 23 views
2

我的類函數送花兒給人需要做一些以前這樣的(蟒蛇):什麼設計模式,預做一流的功能

class X: 
def f1(): 
    #### 
    if check() == False: 
    return; 
    set_A() 
    #### 
    f1_do_something 

def f2(): 
    #### 
    if check() == False: 
    return; 
    set_A() 
    #### 

    f2_do_something 

而且我想:

class X: 
def f1(): 
    # auto check-return-set_A() 
    f1_do_something 

def f2(): 
    # auto check-return-set_A() 
    f2_do_something 

我讀過約design patterns,我不知道如何在這種情況下應用設計模式。如果沒有任何適合的設計模式,那麼這個問題還有其他解決方案嗎?

回答

5

你可以使用一個decorator

#!/usr/bin/env python 

def check(f, *args, **kwargs): 
    def inner(*args, **kwargs): 
     print 'checking...' 
     return f(*args, **kwargs) 
    return inner 

class Example(object): 

    @check 
    def hello(self): 
     print 'inside hello' 

    @check 
    def hi(self): 
     print 'inside hi' 

if __name__ == '__main__': 
    example = Example() 
    example.hello() 
    example.hi() 

這段代碼將打印:

checking... 
inside hello 
checking... 
inside hi 

如果你走這條路線,請查看functools.wrap,使裝飾意識到原有功能的名稱和文檔。

+1

我建議用裝飾器裝飾器來裝飾你的裝飾器:http://docs.python.org/library/functools.html#functools.wraps – 2012-01-11 06:35:02

+0

@AndersWaldenborg,謝謝,在我的文章中添加了一個註釋。我沒有直接將它添加到代碼中,因爲我想盡可能簡單地關注這個想法。 – miku 2012-01-11 06:38:41