Pythonで抽象基底クラス、Interface(Abstract class)を作る
どーも。弁当職人の等々力です。
お弁当、
サンドイッチのマイ食では高度な技術を使っており… と最近言いたい方第いっております。実際は…秘密です。
さて、話を本題へ。
Pythonで抽象クラスを使うにはどうすればいいのか?という質問をうけました。
今、ABCライブラリという便利なモジュールがあります。Python3では標準のモジュールです。
なぜABCか。abc — Abstract Base Classesの略だそうですね。
名前の通り抽象化(インターフェイス用)の関数です。こっちをドンドン使って行きましょう。
実は今までabcモジュールがなかった時はraiseなどで頑張ってました。今回は古い形も(raise方式)載せておきます。ソースコードの上が古い方法、下がABCモジュールを使った新しい方法です。
なんかマニュアルをみるとごちゃごちゃとわけわからぬこと書いていますが、実はシンプルです。(下のソースコードは海外のソースをそのまま取ってきました。わかりやすかったので)
古いバージョン(python2.4)
# -*- coding:utf-8 -*- # old style class BaseClass: def do_something(self): assert False, "Not implemented"
class DerivedClass(BaseClass): def do_mystuff(self): print "Do my stuff!" def do_something(self): print "Do something!"
if __name__ == "__main__": c = DerivedClass() c.do_something() c.do_mystuff()
|
新しいバージョン(python2.6以降) 標準ライブラリABCモジュール利用
# New version from abc import ABCMeta, abstractmethod class BaseClass: __metaclass__ = ABCMeta @abstractmethod def do_something(self): pass
class DerivedClass(BaseClass): def do_mystuff(self): print "Do my stuff!" def do_something(self): print "Do something!"
if __name__ == "__main__": c = DerivedClass() c.do_something() c.do_mystuff()
|
abcモジュールを使う場合、必ず定義させたい関数名の上に@abstractmethodをおきます。
お気軽です!
株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ等々力 康弘
@rocky_house