🐣
【Python】オブジェクト指向学習 - 抽象クラス -
作成日:
2021/07/05
0
注意)このTicketはあくまで自分用のメモ。厳密な定義などは参考サイトを参照のこと
抽象クラスについて学ぶ
参考サイト1の動画で紹介されているTypeScriptのコードを自分なりにpythonに書き直して学習する。
抽象クラスとは
pythonでの書き方
from abc import ABCMeta, abstractmethod
#抽象クラス
class TableCreator(metaclass=ABCMeta):
#ここから・・・
def __init__(self,list):
self.__list = list
#本当はDBから取ってくるとか
def getList(self):
return self.__list
#・・・ここまでは共通化してしまいたい
@abstractmethod
def create(self):
pass
抽象クラス自体をインスタンス化することはできない
if __name__=='__main__':
TableCreator()
実行結果
TypeError: Can't instantiate abstract class TableCreator with abstract method create
抽象クラスを継承することで利用する
class CsvTableCreator(TableCreator):
def create(self):
LIST = self.getList()
HEADER = "名前, 得点\n"
BODY= [l['name'] + "," + str(l['score']) for l in LIST]
return HEADER + "\n".join(BODY)
if __name__=='__main__':
items = [{ 'name': '佐藤', 'score': 45 }, \
{ 'name': '小笠原', 'score': 67 },\
{ 'name': '田中', 'score': 89 }]
print(CsvTableCreator(items).create())
実行結果
名前, 得点
佐藤,45
小笠原,67
田中,89
継承したクラスは抽象クラスで定義したabstractmethodを持たないとエラーになる
class HtmlTableCreator(TableCreator):
def test(self):
return "test"
if __name__=='__main__':
items = [{ 'name': '佐藤', 'score': 45 }, \
{ 'name': '小笠原', 'score': 67 },\
{ 'name': '田中', 'score': 89 }]
print(HtmlTableCreator(items).test())
実行結果
TypeError: Can't instantiate abstract class HtmlTableCreator with abstract method create
抽象クラス どういったときに使う?
クラスA、クラスBに共通の処理があり、親クラスを作りたいときに使える。
この場合、普通のクラスを親にして継承してもいい。
でも例えば、両クラスとも同じメソッドを持つがメソッドの処理内容自体は異なるといった場合に普通のクラスで作ってしまうとif文等で条件分岐するしかない。
しかし、抽象クラスを用いれば抽象クラスでは定義だけして、継承先のクラスA、クラスBでメソッドの中身を定義するといったことができる。
また、抽象クラスを用いると子クラスに持たなければならないメソッドを強制することができるので、拡張されていくときに安全に管理できる。
注意点
- register() を使った方法で登録した仮想サブクラスに対してはチェックが走らない
- @abstractmethod で登録されたメソッド自身が
pass
以外の実装を持つことができて、サブクラスから super() で呼び出すことができる - @abstractmethod で登録したメソッドの引数については、継承先でチェックされない
書いたコード
参考サイト
フリーランスでpythonエンジニアとして働きたく勉強中。
前職は運用SEとセキュリティエンジニア。
開発は学校で学んだ経験と趣味でやっていた程度。一応前職でも業務の自動化のためにExcel VBAやセキュリティテスト用のWebサイトの開発やセキュリティテストツールの改良などで開発はやっていた。