Python Украсить все методы подкласса и предоставить средства для переопределения.

Я работаю над поиском способа уменьшить количество шаблонных декораторов. У нас есть много классов, в которых используется @decorate. Например:

class MyClass(Base):
     @decorate
     def fun1(self):
         pass
     @decorate
     def fun2(self):
         pass
     def fun3(self):
         pass

Я хочу сделать так, чтобы декоратор по умолчанию присутствовал, если кто-то не укажет иное.


Я использую этот код для автоматического обертывания

from functools import wraps

def myDecorator(func):
    @wraps(func)
    def decorator(self, *args, **kwargs):
        try:
            print 'enter'
            ret = func(self, *args, **kwargs)
            print 'leave'
        except:
            print 'exception'
            ret = None

        return ret

    return decorator

class TestDecorateAllMeta(type):
    def __new__(cls, name, bases, local):
        for attr in local:
            value = local[attr]
            if callable(value):
                local[attr] = myDecorator(value)
        return type.__new__(cls, name, bases, local)

class TestClass(object):
    __metaclass__ = TestDecorateAllMeta

    def test_print2(self, val):
        print val

    def test_print(self, val):
        print val

c = TestClass()
c.test_print1("print 1")
c.test_print2("print 2")

Мой вопрос:

  1. Есть ли лучший способ выполнить автоматическое декорирование?
  2. Как я могу выполнить переопределение?

В идеале мое конечное решение было бы быть примерно таким:

class TestClass(object):
    __metaclass__ = TestDecorateAllMeta

    def autowrap(self):
        print("Auto wrap")

    @dont_decorate
    def test_dont_decorate(self, val):
        print val

Edit

Чтобы поговорить с одним из комментариев ниже, поскольку классы вызываются вместо выполнения

if callable(value):

Он должен читать:

if isinstance(value,types.FunctionType) 
6
задан Nix 23 November 2011 в 18:09
поделиться