Pythonでオブジェクト指向の抽象化(ポリモーフィズム)について解説していく

スポンサーリンク
スポンサーリンク

イントロダクション

この記事では、Pythonのオブジェクト指向プログラミングのアプローチにおける抽象化の概念について説明する予定です。

もしあなたがオブジェクト指向に慣れていないなら、Pythonのオブジェクト指向プログラミングの記事を読むことを強くお勧めします。

基本的に、抽象化とは、ユーザーからプロセスやメソッドの内部実装を隠すことに焦点を当てます。

この方法では、ユーザは自分が何をしているかはわかりますが、どのように作業が行われているかはわかりません。

実生活とプログラミングにおけるその重要性を知るために、このトピックをもう少し掘り下げてみましょう。


Pythonにおける抽象化とは?

オブジェクト指向プログラミングでは、継承、ポリモーフィズム、カプセル化は密接に関係しています。

しかし、抽象化もまたオブジェクト指向の本質的な要素です。

例えば、人は自動車を何千もの部品からなる集合体とは考えません。

その代わり、自動車は独自の動作をする明確に定義されたオブジェクトと見なします。

この抽象化により、自動車を形成する部品の複雑さを知らなくても、自動車を使って運転することができるようになる。

エンジンやトランスミッション、ブレーキシステムなどの仕組みの詳細は無視できる。

その代わりに、全体としてのオブジェクトを自由に利用することができるのです。

抽象化を管理する強力な方法は、階層的な分類を使用することです。

これにより、複雑なシステムのセマンティクスをレイヤー化し、より管理しやすいピースに分割することができます

自動車は、外から見ると1つの物体です。

しかし、車内に入ると、ステアリング、ブレーキ、サウンドシステム、シートベルトなど、いくつかのサブシステムで構成されていることがわかる。

そして、これらのサブシステムの一つひとつは、より小さな単位で構成されています。

要は、自動車(あるいは他の複雑なシステム)の複雑さを、階層的な抽象化を使って管理しているのです。

これは、OOPの概念を用いたコンピュータプログラムにも適用できます。

これがオブジェクト指向プログラミングの本質です。


Pythonの抽象クラスとメソッド

抽象クラスを宣言するには、まず abc モジュールをインポートする必要があります。

例を見てみましょう。

from abc import ABC
class abs_class(ABC):
     #abstract methods

ここで、abs_class は抽象クラスであり、その内部で抽象メソッドやその他の種類のメソッドを定義することができる。

プロパティとして、抽象クラスは任意の数の抽象メソッドと任意の数の他のメソッドを共存させることができる。

例えば、以下のようなものです。

from abc import ABC, abstractmethod
class abs_class(ABC):
    #normal method
    def method(self):
        #method definition
    @abstractmethod
    def Abs_method(self):
        #Abs_method definition

ここで、method() は通常のメソッドであり、Abs_method() は abc モジュールの @abstractmethod を実装した抽象的なメソッドです。


Pythonの抽象化例

抽象クラスと抽象メソッドについて理解したところで、Pythonの抽象化について説明する例を見てみましょう。

from abc import ABC, abstractmethod
class Absclass(ABC):
    def print(self,x):
        print("Passed value: ", x)
    @abstractmethod
    def task(self):
        print("We are inside Absclass task")
 
class test_class(Absclass):
    def task(self):
        print("We are inside test_class task")
 
class example_class(Absclass):
    def task(self):
        print("We are inside example_class task")
 
#object of test_class created
test_obj = test_class()
test_obj.task()
test_obj.print(100)
 
#object of example_class created
example_obj = example_class()
example_obj.task()
example_obj.print(200)
 
print("test_obj is instance of Absclass? ", isinstance(test_obj, Absclass))
print("example_obj is instance of Absclass? ", isinstance(example_obj, Absclass))

結果は以下の通りです。

Python Abstraction Example
Python Abstraction Example

ここで

Absclassは abc モジュールの ABC クラスを継承した抽象クラスです。

このクラスは、ユーザから見える抽象的なメソッドtask()print()を含んでいる。

この抽象クラスを継承する他の二つのクラスはtest_classexample_classです。

どちらも独自のtask()` メソッド (抽象メソッドの拡張) を持っています。

ユーザーが test_class と example_class の両方からオブジェクトを生成して task() メソッドを呼び出すと、両方のクラス内部の task() メソッドの隠し定義が利用されるようになります。

これらの定義はユーザから隠されています。

抽象クラス Absclass の抽象メソッド task() は、実際には一度も呼び出されることはありません。

しかし、test_obj と example_obj の両方で print() メソッドを呼び出すと、Absclass の print() メソッドは抽象メソッドではないので、呼び出されます。

注意: 抽象クラスのインスタンスを作成することはできません。

Errorが発生します。


まとめ

この記事では、Pythonの抽象化の概念について理解しました。

さらに関連する質問がある場合は、以下のコメント欄からお気軽にどうぞ。


タイトルとURLをコピーしました