这是我要做的事情的要点。我有一个对象列表,我知道它们有一个实例方法,如下所示:
def render(self, name, value, attrs)
# Renders a widget...
我想(essentialy)在运行时装饰这些函数,因为我正在迭代对象列表。这样他们的渲染功能就变成了这个:
def render(self, name, value, attrs)
self.attrs=attrs
# Renders a widget...
两个警告:
这里有一个例子: http://wiki.python.org/moin/PythonDecoratorLibrary
显示如何向类添加新的实例方法。这里的不同之处在于,在我记住了attrs参数之后,我想要了解原始方法。
答案 0 :(得分:7)
def decorate_method(f):
def wrapper(self, name, value, attrs):
self.attrs = attrs
return f(self, name, value, attrs)
return wrapper
def decorate_class(c):
for n in dir(c):
f = getattr(c, n)
if hasattr(f, 'im_func'):
setattr(c, n, decorate_method(f.im_func))
您可能需要其他一些测试来跳过具有不同签名的方法,但除此之外,decorate_class(whatever)
应该在任何给定的类whatever
上执行您想要的操作。
答案 1 :(得分:3)
“经典”方式是子类。通过这种方式,您不必乱用其他人类。
class someclass(object):
def render(self, name, value, attrs):
print hasattr(self, 'attrs')
class my_render(object):
def render(self, name, value, attrs):
self.attrs = attrs # kind of decorating the function here
return super(my_render, self).render(name, value, attrs)
class my_class(my_render, someclass):
pass
someclass().render(1,2,3) # -> False
my_class().render(1,2,3) # -> True
MI的原因是所有类都可以从my_render
继承。我喜欢mixin概念; - )
class my_otherclass(my_render, someotherclass): pass
class my_thirdclass(my_render, thirdclass): pass
# or less explicit
classlist = [ someclass, someotherclass ]
newclasses = [ type('my_'+cls.__name__, (my_render,cls), {}) for cls in classlist ]