2017-08-22 16 views
5

Tôi có một lớp trừu tượng, Model, với một vài phương pháp trừu tượng, tôi nên đặt gì vào phần thân của các phương thức?Nội dung phương pháp trừu tượng trong Python 3.5

  1. Tờ

    class Model(metaclass=ABCMeta): 
        @abstractmethod 
        def foo(self): return 
    
  2. Một đường chuyền

    class Model(metaclass=ABCMeta): 
        @abstractmethod 
        def foo(self): pass 
    
  3. Nâng cao một lỗi mô tả

    class Model(metaclass=ABCMeta): 
        @abstractmethod 
        def foo(self): 
         raise NotImplementedError("Class {class_name} doesn't implement {func_name} function" 
               .format(class_name=self.__class__.__name__, func_name=self.__init__.__name__)) 
    

Thông thường tôi sẽ thực hiện phương pháp 3 và nâng cao một lỗi, tuy nhiên có vẻ như nó sẽ là không cần thiết, như Python đặt ra một lỗi cho tôi:

>>> bar = module.Model() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: Can't instantiate abstract class Model with abstract methods foo 

giữa các tùy chọn trình bày, đó là thực hành tốt nhất? Hoặc là có một cách khác tôi nên xử lý này?

+1

Đừng quên rằng việc gọi mã là có thể, tức là 'super(). Foo()' được hỗ trợ. – dhke

+0

Bản sao của [Tôi nên đặt gì vào phần thân của một phương thức trừu tượng trong Python] (https://stackoverflow.com/q/40894284/2301450). – vaultah

Trả lời

7

Điều tốt nhất để đặt trong phần nội dung của abstractmethod (hoặc abstractproperty) sẽ là một chuỗi tài liệu.

Sau đó, bạn không cần pass hay return hoặc ... vì một return None được ngầm bao gồm - và một docstring làm cho cấu trúc này "biên dịch" mà không có một SyntaxError:

from abc import abstractmethod, ABCMeta 

class Model(metaclass=ABCMeta): 
    @abstractmethod 
    def foo(self): 
     """This method should implement how to foo the model.""" 

Các docstring thì nên giải thích những gì cần được được triển khai ở đây để các lớp con biết những gì được dự định.

+1

Ah, ý tưởng hay! Tôi không lý do tại sao tôi không nghĩ về điều này. Tôi đã đăng câu trả lời bằng cách sử dụng 'pass', nhưng đây là một ý tưởng tốt hơn cho những lý do bạn đã đề cập. +1 –

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