装饰器上的抽象方法

Ian*_*cks 20 python decorator abc

在python中,有没有办法让抽象方法上的装饰器继续执行派生的实现?

例如,在

import abc

class Foo(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    @some_decorator
    def my_method(self, x):
        pass

class SubFoo(Foo):
    def my_method(self, x):
        print x
Run Code Online (Sandbox Code Playgroud)

SubFoomy_method将不会饰some_decorator据我可以告诉.有没有什么方法可以实现这一点,而无需单独装饰每个派生类Foo

Jin*_*ksy 7

我将其编码为两种不同的方法,就像标准方法工厂模式描述中一样。

https://www.oodesign.com/factory-method-pattern.html

class Foo(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    @some_decorator
    def my_method(self, x):
        self.child_method()

class SubFoo(Foo):
    def child_method(self, x):
        print x
Run Code Online (Sandbox Code Playgroud)


小智 -1

我的解决方案是扩展超类的方法而不覆盖它。

import abc

class Foo(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    @some_decorator
    def my_method(self, x):
        pass

class SubFoo(Foo):
    def my_method(self, x):
        super().my_method(x)  #delegating the call to the superclass
        print x
Run Code Online (Sandbox Code Playgroud)

  • 这违背了抽象方法的目的。抽象方法的整个思想是它们必须被子类覆盖。因此,您不会对其调用“super()”。事实上,除了标记为抽象之外,我通常还让我的抽象方法引发一个“NotImplementedError”,以确保不使用“super()”。 (4认同)