定义函数存根enmasse

时间:2013-10-30 20:49:07

标签: python inheritance decorator

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

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

包含此装饰器的对象的超类具有相当多的功能,我宁愿不必为它们中的每一个写出存根。正如您所知,这些函数的内容不是很重要,只需要存根。

是否有某种方法来定义函数存根?或者有一些方法我可以指出我只想将这个装饰器应用于每个继承的函数吗?

1 个答案:

答案 0 :(得分: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