2014-02-06 3 views

ответ

14

Хотя это не редкость увидеть people using NotImplementedError, некоторые будут утверждать, что «правильный» способ сделать это (с Python 2.6) использует абстрактный базовый класс через abc module:

from abc import ABCMeta, abstractmethod 

class MyAbstractClass(object): 
    __metaclass__=ABCMeta 
    @abstractmethod 
    def my_abstract_method(): 
     pass 

Существует два основных (потенциальных) преимущества при использовании abc с использованием NotImplementedError.

Во-первых, Вы не сможете создать экземпляр абстрактного класса (без необходимости __init__ хаки):

>>> MyAbstractClass() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: Can't instantiate abstract class MyAbstractClass with abstract methods my_abstract_method 

Во-вторых, вы не сможете создать экземпляр любого подкласса, который не реализует все абстрактные методы:

>>> class MyConcreteClass(MyAbstractClass): 
...  pass 
... 
>>> MyConcreteClass() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: Can't instantiate abstract class MyConcreteClass with abstract methods my_abstract_method 

Here's a more complete overview on abstract base classes

Смежные вопросы