2013-07-01 41 views
12

Tôi có một lớp "trừu tượng", chẳng hạn như:Có thể bằng Python để khai báo phương thức đó phải được ghi đè không?

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

    def do_some_boring_stuff(): 
     return 2 + 2 

Và lớp B, subclassing A:

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

Có cách nào để khai báo, mà là một phương pháp A.do_some_cool_stuffphải được overriden , và, có thể là một số cảnh báo nên được nâng lên trong khi cố gắng để tạo ra đối tượng B-class, khi B đã không thực hiện A.do_some_cool_stuff?

Trả lời

25

Vâng, bằng cách định nghĩa A như một 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 

Bạn có thể phân lớp A, nhưng bạn chỉ có thể tạo thể hiện của một lớp con như vậy nếu phương pháp do_some_cool_stuff() có thực hiện cụ thể:

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

Đó là những gì tôi đã tìm kiếm, cảm ơn! –

Các vấn đề liên quan