Pythonでオブジェクト指向
オブジェクト指向の三大要素
カプセル化
関連するデータやそれに対する操作をひとつのオブジェクトにまとめ、外部には情報の開示と最低限の操作だけ提供することです。
オブジェクトの変数や関数のうち、外部から直接参照する必要のないデータや使わない操作は保護し、秘匿される必要があります。
保護するとは、そのクラスの外で使用したり書き換えたりしないようにすることです。
これにより、プログラム間の疎結合性が維持され、メンテナンスが容易になります。
また、型が違う等のエラーを出しにくくしたり、データを保護することができます。
特に大規模のシステムを構築する場合は重要です。
ポリモーフィズム(多様性)
同じ関数や変数であるが、データの型に合わせて異なる動作ができるということです。
型に合わせてメソッドを作ると、プログラムがとても長くなってしまいます。
継承
あるクラスのメンバやメソッドを引き継いで新しい子クラスを作ることです。
継承することで、共通部分をまとめて再利用できます。
継承には特殊なものがあり、それは以下の二つの継承です。
抽象クラス
抽象クラスはインスタンスを作ることができず、継承されて初めてプログラムとして機能します。
抽象クラスではメソッドの実装と、抽象メソッドの宣言を行うことができます。
宣言された抽象メソッドは継承先で必ず実装する必要があります。
インターフェース
ここではプログラムは書かず、メソッドの宣言だけを行います。
継承したクラスはそのメソッドを必ず実装する必要があります。
また、通常の継承や抽象クラスの継承では複数のクラスを継承することはできませんが、インターフェースは多重継承を行うことができます。
インターフェースを分けることで、その部品を継承するかしないか選ぶことができます。
抽象クラスとインターフェースの違い
抽象クラスはメソッドの実装を行うことができます。
インターフェースは多重継承を行うとができます。
別の見方では、抽象クラスは内部向け、インターフェースは外部向け、というものもあります。
抽象クラスを継承する場合はそこで完結する場合が多く、インターフェースを継承する場合は外部でそのインスタンスを使用することが多いです。
pythonでは
カプセル化
Pythonでは、変数やメソッドは全てpublicなので、アンダースコア_で区別します。
アンダースコアが最初に一つ付いた変数やメソッドはprivateとして扱います。
Class ClassName():
def __init__(self):
self.public_variable = ‘safe’
self._private_variable = ‘unsafe’
def public_method():
pass
def _private_method():
pass
抽象クラス
pythonでは、抽象規定クラス(ABC:Abstract Base Class)を使います。
class BaseClassName(metaclass=ABCMeta):
@abstractmethod
def abst_method_name(self):
pass
def method_name(self):
print(self.name)
メタクラスにABCMetaを指定し、抽象メソッドの定義に@abstractmethodというデコレータをつけます。
これにより継承するクラスはabst_method_nameを必ずオーバーライドしなければなりません。
インターフェース
pythonには標準でインターフェースがなく、多重継承が可能なので、インターフェースっぽいものしか作れません。
っぽいものを作る場合は、上記の抽象クラスを実装なしで定義します。