Укажите действие, которое будет выполнено в конце многих функций - PullRequest
1 голос
/ 20 января 2011

У меня есть объект 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 ]

6 голосов
/ 20 января 2011

Я думаю, что любое решение вашей проблемы было бы непифоничным, потому что (как говорит Тим ​​Питерс в «Дзэн Питона» (import this)):

Explicit is better than implicit.
3 голосов
/ 20 января 2011

Да, использование декоратора на самом деле больше кода, но у него есть то преимущество, что вы можете видеть, что метод обновляет все с одного взгляда.Это другой тип явности; -)

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 голосов
/ 20 января 2011

Может быть, наоборот?

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...