2013-07-01 9 views
12

Ho una classe di "astratto", come ad esempio:E 'possibile in Python dichiarare che il metodo deve essere sovrascritto?

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

    def do_some_boring_stuff(): 
     return 2 + 2 

e di classe B, sottoclasse A:

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

Esiste un modo per dichiarare, che un metodo A.do_some_cool_stuffdeve essere ignorato e, probabilmente, qualche avvertimento dovrebbe essere sollevato mentre si tenta di creare un oggetto di classe B, quando B non aveva implementato A.do_some_cool_stuff?

risposta

25

Sì, definendo A come 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 

È possibile creare una sottoclasse A, ma è possibile creare solo le istanze di tale sottoclasse se il metodo do_some_cool_stuff() dispone di un'implementazione concreta:

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

Questo è quello che stavo cercando, grazie! –