Python3でJavaのような抽象クラスを作ろうとしたのですが、ABCモジュールについてわからないことがあります。
下記のようにクラスフィールドの__metaclass__にABCMetaを格納、関数(hello)に@abstractmethodというデコレータをつける必要性がわかりません。
抽象クラスを継承したサブクラスで、抽象メソッドを実装しなくてもエラーになりませんでした。これはhello()でpassという一文を加えているので、抽象メソッドではなく何も実行しないというメソッドを定義したことになるからでしょうか?
しかし、passを削除すると文法エラーになるのでpassを記述せざるおえません。
サブクラスで抽象メソッドを記述した場合は実装ではなくオーバーライドになるのでしょうか?これが理由で既に実装済みのメソッドという扱いになるためエラーにはならないと思っています。下記のソースだとサブクラスでhelloは記述しておりませんが、既に何もしないhelloが実装済みになっていると思っています。
ここで絶対にオーバーライドして欲しいメソッドにはraiseを使いエラーを投げるようにすれば良いと思うのですが、それだと__metaclass__ = ABCMeta、@abstractmethodは必要ないと思います。
なぜこの2つの記述が必要になるかがわかりません。この理由を教えていただけませんでしょうか?
また、この2つの記述が必須ではない場合は使用した場合のメリットが知りたいです。
よろしくお願い致します。
抽象クラス(abstract.py)
lang
1from abc import * 2 3class Abstract(object, metaclass=ABCMeta): 4 #__metaclass__ = ABCMeta 5 6 @classmethod 7 @abstractmethod 8 def hello(cls): 9 pass
実装クラス(implement.py)
lang
1from Abstract import * 2 3class Implement(Abstract): 4 5 @classmethod 6 def say(cls): 7 print('say')
実行ファイル(main.py)
lang
1from implement import Implement 2 3if __name__ == '__main__': 4 Implement.say() 5 Implement.hello() 6 7# => say

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/30 00:07