我正在干一些带有类代码副本并粘贴的代码。我已将代码分为不同的子类,以实现所需的不同元素,但是代码的残余之一是,每个类的特定装饰器都被称为通用方法。在此示例中,它就是foo方法。@some_decorator_function过去是从每个类的另一个命名空间导入的。现在,装饰器仅从父类中调用一次,因此它不知道用作子类的装饰器需要选择它。有没有办法将要装饰的函数委托给子类?我的想法(并NotImplementedError立即提出,因为对X求值):class X: def some_decorator_function(): raise NotImplementedError @some_decorator_function() def foo(self): return "Yo!"def concrete_function(func): passclass Y(X): def some_decorator_function(): concrete_functionY().foo
2 回答

RISEBY
TA贡献1856条经验 获得超5个赞
您可以将装饰器转换为更通用的模式。
def class_defined_decorator(func):
def wrapper(*args, **kwargs):
return args[0]._decorator(func, *args, **kwargs)
return wrapper
class Base(object):
def _decorator(self, func, *args, **kwargs):
raise NotImplementedError
@class_defined_decorator
def foo(self):
pass
class Child(Base):
def _decorator(self, func, *args, **kwargs):
# Do decorator behavior
return func(*args, **kwargs)
如果必须支持使用相同的装饰器装饰静态,类和实例方法,则可以通过使装饰器返回描述符来提高想象力。
添加回答
举报
0/150
提交
取消