我有一个对象,其主要价值在于将给定的装饰器应用于它从超类继承的每个函数,并提供它的单独版本。作为参考,装饰者如下:
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
包含此装饰器的对象的超类具有相当多的功能,我宁愿不必为它们中的每一个写出存根。正如您所知,这些函数的内容不是很重要,只需要存根。
是否有某种方法来定义函数存根?或者有一些方法我可以指出我只想将这个装饰器应用于每个继承的函数吗?
答案 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