【Python】Python ~ 基本編 / 抽象クラス ~

■ はじめに

https://dk521123.hatenablog.com/entry/2019/10/12/075251
https://dk521123.hatenablog.com/entry/2019/08/29/220537

の続き。

今更ながら、Pythonの抽象クラス(Abstract Class)
を知ったので、メモ。

目次

【1】Pythonの抽象クラス - ABC (Abstract Base Classes)
【2】abc.ABC と abc.ABCMeta との違い
【3】サンプル

【1】Pythonの抽象クラス - ABC (Abstract Base Classes)

https://docs.python.org/ja/3/library/abc.html#abc.ABC

* ABC クラスを継承して実装する
 => はじめ見た時に、テストで適当に作ったクラスかと思ってしまった、、、
 => Python には、 interface がないので、その代わりにもなる
  (以下のサイトなどを参照)

https://www.lifewithpython.com/2017/11/python-interface.html
https://qiita.com/baikichiz/items/7c3fdb721bb72644f638

【2】abc.ABC と abc.ABCMeta との違い

https://docs.python.org/ja/3/whatsnew/3.4.html#abc

より抜粋
~~~~~~~~~~~~~~~~~
新規クラス ABC はそのメタクラスとして ABCMeta を持ちます。
この ABC を基底クラスとして使うことは 
metaclass=abc.ABCMeta を指定するのと本質的に同じ効果を持ちますが、
少ないタイプ数で単純に書ける上に読みやすいものになります。
~~~~~~~~~~~~~~~~~

要するに

* 書き方が違うだけでほとんど一緒。
* なので、ABC の書き方を覚えてればよさげ。

【3】サンプル

抽象クラス・DemoAbstract.py

from abc import ABC, abstractclassmethod

class DemoAbstract(ABC):
  @abstractclassmethod
  def initialize(self) -> bool:
    pass

  @abstractclassmethod
  def execute(self) -> bool:
    pass

  @abstractclassmethod
  def finalize(self) -> bool:
    pass

使用者・DemoExecutor.py

from DemoAbstract import DemoAbstract


class DemoExecutor(DemoAbstract):
  def initialize(self) -> bool:
    print("初期化処理")
    return True

  def execute(self) -> bool:
    print("何らかの実行処理")
    return True

  def finalize(self) -> bool:
    print("後処理")
    return True

# 呼び出し
executor = DemoExecutor()
executor.initialize()
executor.execute()
executor.finalize()

出力結果

初期化処理
何らかの実行処理
後処理

参考文献

https://ohke.hateblo.jp/entry/2020/02/01/123000
https://qiita.com/kaneshin/items/269bc5f156d86f8a91c4

関連記事

Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / クラス・継承 ~
https://dk521123.hatenablog.com/entry/2019/08/29/220537
Python ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2014/08/07/231242