LoginSignup
3
7

More than 3 years have passed since last update.

pythonでオブジェクト指向

Last updated at Posted at 2019-12-02

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には標準でインターフェースがなく、多重継承が可能なので、インターフェースっぽいものしか作れません。
っぽいものを作る場合は、上記の抽象クラスを実装なしで定義します。

3
7
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7