23

我有一个“抽象”类,例如:

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

    def do_some_boring_stuff():
        return 2 + 2

和 B 类,子类 A:

class B(A):
    def do_stuff()
        return 4

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

4

1 回答 1

46

是的,通过定义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

您可以创建子类,但如果该方法具有具体实现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
于 2013-07-01T10:47:08.917 回答