Python カプセル化、プロパティ、ゲッター、セッターについての解説

はじめに

みなさんこんにちはALEXです。今回は「カプセル化」について解説したいと思います。オブジェクト指向プログラミングの中核となる「カプセル化、プロパティ、ゲッター(getter)、セッター(setter)について、Google先生に聞いても、わかりやすい記事が少ないので、まとめてみます。長文になそうですが、読んで難しくなってもぜひまた戻ってきてください。  

カプセル化とは

Pythonではすべての属性やメソッドが外部に対して公開され、自由に使うことができます。ですがインスタンス変数はクラスの中でしか使用しない、とかインスタンス変数ん位自由にアクセスされたくない、ということが多々あります。   こんな時には、クラス内部を非公開にすることができます。ただ、非公開になるとクラスの存在そのものが必要なくなってしまうこともあるので、プロパティという間接的にクラスにアクセスできる仕組みがあります。実際にコードを見ながら確認してみましょう。  

サンプルコード

インスタンス変数へのアクセスをプロパティ経由にしてクラスを作成してみましょう。以下がコードの全文です。ダブルアンダースコア、property、ゲッター、セッターが登場します。  

 

ダブルアンダースコアを使ったカプセル化(隠ぺい)

インスタンス変数として__max,  __countが登場しました。属性名やメソッド名の前にダブルアンダースコアを付けると、クラスの外部からアクセスできなくなります。これをカプセル化または隠ぺいと呼びます。

 

インスタンス変数のゲッターとセッターの定義

カプセル化したがけでは意味がないので、インスタンス変数にアクセスする方法を準備します。ゲッターはインスタンス変数の値を取得するためのメソッドで、セッターは値を設定するためのメソッドです。メソッドの名前の付け方にルールはありませんが、”get_変数名()”、”set_変数名()”と記述するのが一般的です。  

ゲッターの書式

 

セッターの書式

 

プロパティの定義

インスタンス変数である__maxと__countにアクセスするためのプロパティはproperty()関数で定義します。

プロパティの書式

property()はビルトイン関数の一つで、ゲッターとセッターの情報を持っているオブジェクトを返します。上記の書式にならい以下のように記述することで、get_max(),set_max()を返す機能を持つmaxプロパティを作ることができます。

 

プログラム実行部

Countupクラスをオブジェクト化し、maxを 外部から設定します。そしてforループの中でメソッドを実行します。 出力結果は以下の通りです。

 

 

まとめ

今回は「カプセル化」について解説しました。思うほど難しくないと思います。プロパティを使うことで、カプセル化したインスタンス変数にゲッターとセッター経由でアクセスが可能になりました。この方法はクラス内部でしか使わないインスタンス変数やメソッドに、最初からダブルアンダースコアを付けておけば外部からの書きかえ間違いを防ぐということにも使うことができます。

 

クラス変数にメソッドからアクセスする場合

連載目次

初心者にもわかるオブジェクト指向

クラス

継承

ポリモーフィズム

インスタンス変数の隠ぺい

オーバーライドと多重継承

クラスメソッド

名前空間

グローバル変数とローカル変数の使い方

クラス変数にメソッドからアクセスする場合

カプセル化、プロパティ、ゲッター、セッターについての解説