2016-11-30 36 views
1
什麼

說我有以下的抽象類Foo我應該把體內的抽象方法在Python

import abc 

class Foo(abc.ABC): 

    @abc.abstractmethod 
    def bar(self): 
     raise NotImplementedError 

我應該把在bar方法的主體?

我看到很多代碼有raise NotImplementedError,如上所示。但是,這似乎是多餘的,因爲任何未實現bar的子類在實例化時都會引發TypeError: Can't instantiate abstract class Foo with abstract methods bar

它是Python的離開bar空,如下所示:

import abc 

class Foo(abc.ABC): 

    @abc.abstractmethod 
    def bar(self): 
     ... 

這就是在Python文檔做了Abstract Base Classes,但我不知道這只是一個佔位符或一個實際的例子如何編寫代碼。

如果將bar只留下三個點(...),那麼我應該何時使用NotImplementedError

回答

4

該文檔確實旨在給你一個例子。你不必遵循它。

您可以提供默認值;子類仍然可以使用super()來調用您的實現。這是大部分collections.abc類所做的;請參閱source code

Size例如,對於__len__返回0

class Sized(metaclass=ABCMeta): 
    # ... 
    @abstractmethod 
    def __len__(self): 
     return 0 
+0

感謝您的鏈接。 [MutableSet.add](https://hg.python.org/cpython/file/3.5/Lib/_collections_abc.py#l508)和[MutableSet.discard](https://hg.python.org/cpython/file /3.5/Lib/_collections_abc.py#l513)會引發'NotImplementedError',所以我想我應該堅持使用那個約定而不是'...'。 – ostrokach

相關問題