我有一個叫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
但時I g加時賽這樣的:
TypeError: cascaded_modifier() takes at least 1 argument (0 given)
什麼是使用我試圖在這個問題解釋範式解決在Python 2.7這個問題的最好方法?
......你爲什麼要這樣做?有沒有更簡單的方法?爲了對付子類(這對於可擴展性來說是一個非常糟糕的主意),而不是改變'self.render',你不能僅僅使子類實現,比如'_render',它被'render'調用。他們沒有超載?或者你不能實現'superrender'並且調用那個而不是'render'?你不能用子子類來繼承他們的MyClass子類並且重載那裏的行爲嗎?你在做什麼似乎是對我的最後一招。 – Veedrac 2014-09-11 15:44:25