2014-02-06 9 views
11

Was ist die ideologisch korrekte Art und Weise rein virtuelle Methoden in Python zu implementieren?Reine virtuelle Methoden in Python

Nur NotImplementedError in den Methoden erhöhen?

Oder gibt es einen besseren Weg?

Vielen Dank!

Antwort

14

Zwar ist es nicht ungewöhnlich, people using NotImplementedError zu sehen, einige argumentieren, dass die „richtige“ Art und Weise, es zu tun (da Python 2.6) wird unter Verwendung einer abstrakte Basisklasse, durch die abc module:

from abc import ABCMeta, abstractmethod 

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

Es gibt zwei hauptsächliche (potenzielle) Vorteile bei der Verwendung von abc gegenüber NotImplementedError.

Erstens Sie werden nicht in der Lage sein, die abstrakte Klasse zu instanziiert (ohne dass __init__ Hacks):

>>> 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 

Zweitens, werden Sie nicht in der Lage sein, jede Unterklasse zu instanziiert, die nicht alle abstrakten nicht implementiert Methoden:

>>> 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

Verwandte Themen