2012-01-11 21 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