【发布时间】:2014-11-04 10:44:24
【问题描述】:
我有一个名为 render 的方法,它实际上是由一个子类实现的,调用方式如下:
class MyClass(object):
def __call__(self, *args, **kwargs):
api_response = self.render(*args, **kwargs)
return api_response
def render(self, *args, **kwargs):
""" This method is implemented by a subclass."""
raise NotImplementedError
def cascade_callables():
print 'Ask awesome people at stackoverflow for the solution to this problem.'
我有一个可调用的列表[c1, c2, c3]。我想在 cascade_callables 方法中做这样的事情,应该是这样的:
def cascade_callables():
callables = [c1, c2, c3]
callables.append(self.render)
self.render = reduce(some_decorator_that_accepts_two_functions, callables)
所以本质上,我正在尝试我的 render 在不修改实际实现的情况下像这样工作:
c1(*args, **kwargs)
c2(*args, **kwargs)
c3(*args, **kwargs)
render(*args, **kwargs)
我尝试了类似的方法来作为我可以在reduce 中使用的装饰器:
def cascade_modifiers(modifier1, modifier2):
def cascaded_modifier(self, *args, **kwargs):
modifier1(self, *args, **kwargs)
modifier2(self, *args, **kwargs)
return cascaded_modifier
但我得到了这个:
TypeError: cascaded_modifier() takes at least 1 argument (0 given)
在 Python 2.7 中使用我尝试在此问题中解释的范例解决此问题的最佳方法是什么?
【问题讨论】:
-
...你为什么要这样做?没有更简单的方法吗?而不是突变
self.render以对接子类(这对于可扩展性来说是一个真的 坏主意),你不能让子类实现,比如_render,它被a调用render他们不会超载?或者你不能实现superrender并调用它而不是render?你不能用子类继承他们的MyClass子类并重载那里的行为吗?你正在做的事情对我来说似乎是最后的手段。
标签: python python-2.7 python-decorators method-resolution-order