2017-09-30 5 views
-2

と抽象クラス<...>をインスタンス化することはできませんが、私のコードです:はTypeError:ここでは抽象メソッド

from abc import ABC 
from abc import abstractmethod 

class Mamifiero(ABC): 
    """docstring for Mamifiero""" 
    def __init__(self): 
     self.alimentacion = 'carnivoro' 

    @abstractmethod 
    def __respirar(self): 
     print('inhalar... exhalar') 


class Perro(Mamifiero): 
    """docstring for Perro""" 
    def __init__(self, ojos=2,): 
     self.ojos = ojos 

私はperro.respirar()プリント'inhalar... exhalar'が、私はPERROクラスをインスタンス化したい私は、このエラーを表示することを望みます。私のスクリプトで何が問題なのかを知りたい

+1

*抽象メソッドを作成して実装するのではないと思ったことは何ですか? – user2357112

+0

実際に['@ abstractmethod'](https://docs.python.org/3/library/abc.html#abc.abstractmethod)は何をしていますか? – poke

+0

抽象メソッドの実装は継承されるものではありません。むしろ、非抽象オーバーライドから 'super().__ respirar()'のようなものを介して呼び出すことができます。 – chepner

答えて

0

定義によって(抽象コールは抽象メソッドがオーバーライドされない限りインスタンス化できません)。オブジェクト指向プログラミングのように設計されています。

親クラスから継承した抽象メソッドPerro.__respirar()はオーバーライドされていません。または、メソッドPerro.__respirar()でそれをオーバーライドし、そこに何かをします(もちろん親のメソッドを呼び出すこともできますが、二重アンダースコアではプライベートではない場合もあります)。

Perroをインスタンス化する場合は、そのメソッドを抽象化しないでください。それは正常です。また、実装にはいくつかの実装があるため、抽象メソッドではなく、通常の基本クラスのメソッドです。

関連する問題