3

我有一个对象,其主要价值是将给定的装饰器应用于它从其超类继承的每个函数并提供它的单独版本。作为参考,装饰器如下:

def hierarchywrapper(func):
    def wrapper(self, *args, **kwargs):
        for key, value in self.hierarchy.items():
            try:
                result = getattr(value, func.__name__)(*args, **kwargs)
                if result and len(result):
                    return result
                else:
                    pass
            except:
                pass
        return None
    return wrapper

包含这个装饰器的对象的超类有很多函数,我不想为每个函数都写出存根。正如你所知道的,这些函数的内容不是很重要,只需要存根。

有什么方法可以定义函数存根吗?或者,有什么方法可以表明我只想将此装饰器应用于每个继承的函数?

4

1 回答 1

2

一种方法是在您的子类上专门化该__getattribute__方法:

def __getattribute__(self, name):
    attr = super(MySuperclass, self).__getattribute__(name)
    if callable(attr):
        return hierarchywrapper(attr)
    else:
        return attr

@eevee 通过包装父对象而不是子类化它提出了一种更通用的方法:

class CallableHierarchyWrapper(object):

    def __init__(self, wrapped_object):
        self.wrapped_object = wrapped_object

    def __getattribute__(self, name):
        attr = self.wrapped_object.__getattribute__(name)
        if callable(attr):
            return hierarchywrapper(attr)
        else:
            return attr
于 2013-10-30T20:59:08.010 回答