【发布时间】:2011-03-08 07:55:46
【问题描述】:
我想在 Python 中实现decorator pattern,我想知道是否有一种方法可以编写一个只实现它想要修改的函数的装饰器,而无需为刚刚转发到的所有函数编写样板文件被装饰的对象。像这样:
class foo(object):
def f1(self):
print "original f1"
def f2(self):
print "original f2"
class foo_decorator(object):
def __init__(self, decoratee):
self._decoratee = decoratee
def f1(self):
print "decorated f1"
self._decoratee.f1()
def f2(self): # I would like to leave that part out
self._decoratee.f2()
我希望自动将呼叫foo_decorator.f2 转接到decoratee.f2。有没有办法编写一个通用方法,将所有未实现的函数调用转发到decoratee?
【问题讨论】:
-
你能举一个简单的子类化不起作用的例子吗?您也可以动态子类化 - 这种模式似乎是一种解决方法,适用于无法做到这一点或不支持多重继承的语言。
-
我想在运行时装饰对象。我想将不同的装饰器应用于一个对象并能够再次删除它们。子类化不能在创建实例后更改它,或者可以吗?
-
如果你有
A类并更改A,即添加一个新方法A.foo = lambda self: self这将反映在 A .. 的所有实例上,因为 everything 是在运行时确定。生成绝对不可维护的代码的好方法。 -
@THC4K:装饰器模式(与 python 装饰器相反)用于在运行时向 object 添加行为。如果正确完成,这实际上是非常可维护的,这就是我发布这个问题的原因。我想在 Python 中找到解决方法。