2016-11-30 3 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が発生するため、これは冗長なようです。

は、次のように、空のbarを残すためにPython的です:

import abc 

class Foo(abc.ABC): 

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

これはAbstract Base ClassesのためのPythonドキュメントで行われているものですが、それはただのプレースホルダや、実際の例だ場合、私はわからないんだけどコードを書く方法。

barを3ドット(...)だけ残しても問題ない場合は、いつNotImplementedErrorを使用しますか?

答えて

4

ドキュメントは、例を示すことを目的としています。あなたはそれに従う必要はありません。

デフォルトを指定できます。サブクラスはあなたの実装を呼び出すのにまだsuper()を自由に使用できます。これは、ほとんどのクラスが行うことです。 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

関連する問題