0

我正在干燥一些具有类代码副本并粘贴的代码。我已将代码制成子类,以实现所需的不同元素,但代码的残余之一是为一个通用命名的方法调用了特定于每个类的不同装饰器。

在这个例子中,它是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):
  pass

class Y(X):
  def some_decorator_function():
    concrete_function

Y().foo
4

2 回答 2

0

您可以将装饰器转换为更通用的模式。

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)

如果您必须支持使用相同的装饰器装饰静态、类和实例方法,您可以通过让装饰器返回描述符来变得更有趣。

于 2013-06-26T18:54:57.573 回答
0

我认为最简单的方法是在 Y 中显式应用正确的装饰器:

class X:
    def foo(self):
        return "Yo!"

def concrete_function(func):
    pass

class Y(X):
    foo = concrete_function(X.foo)

Y().foo
于 2013-06-26T18:40:11.540 回答