是否有可能在Python中声明必须覆盖该方法?

utt*_*tep 16 python oop methods inheritance overriding

我有一个"抽象"类,例如:

class A:
    def do_some_cool_stuff():
        ''' To override '''
        pass

    def do_some_boring_stuff():
        return 2 + 2
Run Code Online (Sandbox Code Playgroud)

和B类,子类A:

class B(A):
    def do_stuff()
        return 4
Run Code Online (Sandbox Code Playgroud)

是否有任何方法可以声明,一个方法A.do_some_cool_stuff 必须被覆盖,并且可能在尝试创建B类对象时应该引发一些警告,当B没有实现时A.do_some_cool_stuff

Mar*_*ers 37

是的,通过定义AABC(抽象基类):

from abc import ABCMeta, abstractmethod

class A(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def do_some_cool_stuff():
        ''' To override '''
        pass

    def do_some_boring_stuff():
        return 2 + 2
Run Code Online (Sandbox Code Playgroud)

您可以继承子类A,但如果do_some_cool_stuff()方法具有具体实现,则只能创建此类子类的实例:

>>> from abc import ABCMeta, abstractmethod
>>> class A(object):
...     __metaclass__ = ABCMeta
...     @abstractmethod
...     def do_some_cool_stuff():
...         ''' To override '''
...         pass
...     def do_some_boring_stuff():
...         return 2 + 2
... 
>>> class B(A):
...     def do_stuff():
...         return 4
... 
>>> B()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class B with abstract methods do_some_cool_stuff
Run Code Online (Sandbox Code Playgroud)