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))
You’ll probably need some other test to skip methods with a different signature, but, apart from that, decorate_class(whatever)
should do what you want on any given class whatever
.
3
The “classic” way is to subclass. This way you don’t have to mess with other peoples classes.
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
The reason for MI is that all classes can inherit from my_render
. I like the mixin concept
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 ]
- [Django]-Getting 'TooBig' Memcachier exception on a Django Rest Framework response on Heroku
- [Django]-Django view response time issues
Source:stackexchange.com