Oop 指定在许多函数结束时要执行的操作
我有一个python对象,其中一组函数需要在执行结束时,即返回语句之前执行相同的操作。例如: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
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中的每个方法都会这样做,这似乎很危险。