2013-07-01 27 views
12

mam "biznes" klasy, takie jak:Czy w Pythonie można zadeklarować, że metoda musi zostać nadpisana?

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

    def do_some_boring_stuff(): 
     return 2 + 2 

i klasy B, podklasy A:

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

Czy istnieje jakiś sposób, aby zadeklarować, że metoda A.do_some_cool_stuffmusi być nadpisane i, być może, że jakieś ostrzeżenie powinno zostać podniesione podczas próby utworzenia obiektu klasy B, kiedy B nie zaimplementowało A.do_some_cool_stuff?

Odpowiedz

25

Tak, definiując A jako ABC (Abstract Base Class):

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 

Można podklasy A, ale można tylko tworzyć instancje takiej podklasy jeśli metoda do_some_cool_stuff() ma konkretną realizację:

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

Tego właśnie szukałem, dzięki! –