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 必要があることを宣言する方法はありますA.do_some_cool_stuffか?

4

1 に答える 1

46

はい、ABC (Abstract Base Class)Aとして定義することにより:

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 に答える