Python修饰子类的所有方法,并提供重写方法

Python修饰子类的所有方法,并提供重写方法,python,python-2.5,Python,Python 2.5,我正在寻找一种减少样板装饰的方法。我们有很多类使用@decoration。例如: class MyClass(Base): @decorate def fun1(self): pass @decorate def fun2(self): pass def fun3(self): pass 我希望在默认情况下,装饰师在那里,除非有人另外指定 我使用此代码执行自动换行 from functoo

我正在寻找一种减少样板装饰的方法。我们有很多类使用@decoration。例如:

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")
我的问题是:

  • 有没有更好的方法来装饰汽车
  • 我怎样才能进行覆盖
  • 理想情况下,我的最终解决方案是:

    class TestClass(object):
        __metaclass__ = TestDecorateAllMeta
    
        def autowrap(self):
            print("Auto wrap")
    
        @dont_decorate
        def test_dont_decorate(self, val):
            print val
    
    编辑

    对下面的一条评论说,因为classess是可调用的,而不是do

    if callable(value):
    
    应改为:

    if isinstance(value,types.FunctionType) 
    

    与其让我的类的用户指定一个
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuu
    属性,不如让它们从定义它的基类派生出来。无需不必要地暴露管道

    除此之外,看起来不错。您的
    @dont\u decoration
    函数decorator可以通过在原始函数上设置一个属性来实现,您的类decorator随后会检测并跳过该修饰(如果存在)

    def dont_decorate(func):
        func._dont_decorate = True
        return func
    
    然后在您的元类中,现在有一行
    if callable(value):
    只需放置:

    if callable(value) and not hasttr(value, "_dont_decorate"):
    
    另一方面,类是可调用的,因此如果您不想修饰内部类,您可能应该使用
    isinstance()
    而不是
    callable()
    检查函数


    如果您对更显式的替代方案感兴趣,您可以看看有人想在哪里使用类装饰器来做本质上相同的事情。不幸的是,这有点复杂,因为当装饰者看到方法时,它们已经被包装好了。

    显式比隐式好。除非有很多样板文件(每个方法有十几行非平凡的代码),否则我会避开元类魔法。见鬼,即使这样,只要可能,我还是更喜欢一个更简单的解决方案。所以我把元类放在子类中的原因是,它只装饰子类的成员。如果我把meta放在父函数中,它将装饰所有函数类型。。。您是否有一种简单的方法来检测被调用的函数是否属于子类?您可以在父类中的所有函数上放置
    @dont\u
    。:-)这让人恼火:)我相信这就是我达到这一点的原因。。。我可以创建一个中间类…或者一种更简洁的方法:用方法声明一个类,然后再声明一个继承自该类并定义
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。然后让用户从第二个类继承。是的,您在我编写第二个类时编写了“中间类”注释!:-)