指定在许多功能结束时要执行的操作

时间:2011-01-20 15:32:41

标签: oop python

我有一个python对象,其中一堆函数需要在执行结束时执行相同的操作,就在return语句之前。例如:

def MyClass(object):
    def __init__(self):
        pass

    def update_everything(self):
        '''update everything'''
        pass

    def f1(self):
        #do stuff
        self.update_everything()
        return result

    def f2(self):
        #do stuff
        self.update_everything()
        return result

    def f3(self):
        #do stuff
        self.update_everything()
        return result

除了每个函数末尾的显式调用之外,最好的(pythonic?)方法是什么?

3 个答案:

答案 0 :(得分:6)

我认为你的问题的任何解决方案都是unpythonic,因为(正如Tim Peters在Python的禅宗中所说的那样(import this)):

Explicit is better than implicit.

答案 1 :(得分:3)

是的,使用装饰器实际上是更多代码,但它确实具有以下优点:您可以看到方法一目了然地更新所有内容。这是一种不同的显性; - )

def update_after(m):
    """ calls self.update_everything() after method m """
    def decorated(self, *args, **kwargs):
        r = m(self, *args, **kwargs)
        self.update_everything()
        return r
    return decorated


def MyClass(object):
    def __init__(self):
        pass

    def update_everything(self):
        '''update everything'''
        pass

    @update_after
    def f1(self):
        #do stuff
        return result

    @update_after
    def f2(self):
        #do stuff
        return result

    @update_after
    def f3(self):
        #do stuff
        return result

答案 2 :(得分:2)

也许相反?

class MyClass(object):
    def update(self, func):
        value = func()
        # do something common
        return value

    def f1(self):
        # do stuff
        return result

    def f2(self):
        # do stuff
        return result

my_object = MyClass()

my_object.update(my_object.f1)

编辑: 您也可以以update接受字符串作为对象方法名称的方式编写它。这会阻止运行其他对象的方法。

my_object.update('f1')