Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 指定在许多函数结束时要执行的操作_Oop_Python - Fatal编程技术网

Oop 指定在许多函数结束时要执行的操作

Oop 指定在许多函数结束时要执行的操作,oop,python,Oop,Python,我有一个python对象,其中一组函数需要在执行结束时,即返回语句之前执行相同的操作。例如: def MyClass(object): def __init__(self): pass def update_everything(self): '''update everything''' pass def f1(self): #do stuff self.update_everythin

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

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

最好的蟒蛇是什么?如何做到这一点,除了每个函数末尾的显式调用之外?

我认为任何问题的解决方案都是非Python的,因为正如Tim Peters在《Python之禅》中所说:


我认为解决您的问题的任何解决方案都是非Python的,因为正如Tim Peters在《Python之禅》中所说:


也许相反

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')

也许相反

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')

是的,使用decorator实际上更多的是代码,但它的优点是,您可以看到一个方法一眼就能更新所有内容。这是另一种明确性-

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

是的,使用decorator实际上更多的是代码,但它的优点是,您可以看到一个方法一眼就能更新所有内容。这是另一种明确性-

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

这可能是self.update\u everything,顺便说一句。您可以编写一个装饰程序,但实际上需要更多的代码行。您可能可以使用元类,但这可能意味着MyClass中的每个方法都会这样做,这似乎很危险。这可能是self.update\u everything,顺便说一句。您可以编写一个decorator,但实际上需要更多的代码行。您可能可以使用元类,但这可能意味着MyClass中的每个方法都会这样做,这似乎很危险。