我有一个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?)方法是什么?
答案 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')