Python

Pythonの抽象クラスって??🐍

Python

抽象クラスとは

  • 他のクラスから継承されることが前提のクラス
  • インスタンス化できない

という特徴を持ったクラスで、「テンプレート」のようなもの

特定のメソッドの実装を強制することができる

なぜ使うのか?

抽象クラスを使う目的は、クラスの基本的な構造を示し、それらのクラスが特定のメソッドを実装することを強制することで、

  • 一貫性
  • 再利用性
  • 拡張性

を向上させることができる

Pythonでの抽象クラスの実装

Pythonでは `abc` モジュール(Abstract Base Class) を利用して抽象クラスを作成できる

from abc import ABC, abstractmethod

class MyAbstractClass(ABC):
    @abstractmethod
    def my_abstract_method(self):
        # このメソッドが継承されていなかったら例外を発生させる
        # 抽象クラスを実装するときはスタンダードな実装
        raise NotImplementedError()

class ConcreteClass(MyAbstractClass):
    def my_abstract_method(self):
        print("ConcreteClassのメソッドです")

# インスタンスしようとするとエラーになる
# my_abstract = MyAbstractClass()  # TypeError

# サブクラスのインスタンス化
my_concrete = ConcreteClass()
my_concrete.my_abstract_method() # ConcreteClassのメソッドです

具体的な実装例

支払い処理を行う複数のクラスがあったとするクレジットカード、デビットカード、電子ウォレットなど、異なる支払い方法がありますが、全てに共通する基本的な動作「承認」「支払い」「払い戻し」があるとする

抽象クラスを使わない場合、各クラス間でメソッド名や動作の不一致が生じる可能性があり、また、もし新しい支払い方法を追加する際に既存のクラスとの整合性を保つのが難しいかも知れない。

抽象クラスを利用するとこれらの問題を解決することができる

from abc import ABC, abstractmethod

# 抽象クラスの定義
class PaymentProcessor(ABC):
    @abstractmethod
    def authorize_payment(self, amount):
        raise NotImplementedError()

    @abstractmethod
    def make_payment(self, amount):
        raise NotImplementedError()

    @abstractmethod
    def refund_payment(self, amount):
        raise NotImplementedError()

# 具体的なサブクラスの定義
class CreditCardProcessor(PaymentProcessor):
    def authorize_payment(self, amount):
        print(f"Credit card authorized for {amount}")

    def make_payment(self, amount):
        print(f"Payment of {amount} made with credit card")

    def refund_payment(self, amount):
        print(f"Refund of {amount} processed to credit card")

class DebitCardProcessor(PaymentProcessor):
    def authorize_payment(self, amount):
        print(f"Debit card authorized for {amount}")

    def make_payment(self, amount):
        print(f"Payment of {amount} made with debit card")

    def refund_payment(self, amount):
        print(f"Refund of {amount} processed to debit card")

まとめ

このように抽象クラスを利用することで、

  • 一貫性
  • 再利用性
  • 拡張性

を向上させることができる

参考
abc --- 抽象基底クラス
ソースコード: Lib/abc.py このモジュールは Python に PEP 3119 で概要が示された 抽象基底クラス(ABC) を定義する基盤を提供します。なぜこれが Python に付け加えられたかについてはその PEP を参照し...

コメント