Ответ 1
Я думаю, что это лучше сделать с помощью метакласса, чтобы обрабатывать как время исполнения, так и подкласс. Я не вижу элегантный способ обработки подклассов автоматически с помощью декоратора класса.
from types import FunctionType
# check if an object should be decorated
def do_decorate(attr, value):
return ('__' not in attr and
isinstance(value, FunctionType) and
getattr(value, 'decorate', True))
# decorate all instance methods (unless excluded) with the same decorator
def decorate_all(decorator):
class DecorateAll(type):
def __new__(cls, name, bases, dct):
for attr, value in dct.iteritems():
if do_decorate(attr, value):
dct[attr] = decorator(value)
return super(DecorateAll, cls).__new__(cls, name, bases, dct)
def __setattr__(self, attr, value):
if do_decorate(attr, value):
value = decorator(value)
super(DecorateAll, self).__setattr__(attr, value)
return DecorateAll
# decorator to exclude methods
def dont_decorate(f):
f.decorate = False
return f
И пример его использования (Python 2, но тривиально модифицированный для Python 3):
def printer(f):
print f
return f
class Foo(object):
__metaclass__ = decorate_all(printer)
def bar(self):
pass
@dont_decorate
def baz(self):
pass
@classmethod
def test(self):
pass
# prints
# <function bar at 0x04EB59B0>
class AnotherName(Foo):
def blah(self):
pass
# prints
# <function blah at 0x04EB5930>
Foo.qux = lambda: 1
# prints
# <function <lambda> at 0x04EB57F0>