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

 

 

はじめに

みなさんこんにちは、ALEXです。今回はインスタンス変数の隠ぺいについて解説します。

隠ぺい

インスタンス変数を隠ぺいしない

クラス内で作成したインスタンス変数(self.xx)はインスタンスの外から読み出すことができます。以下のようなコードを作成してみました。

以下の通り返ります。

Mangle(object)というクラスを作成し、コンストラクタでインスタンス変数aを宣言します。

クラスをインスタンス化し、mangle.aを読み出し、”a”が返っています。

このコードではコード内から自由に変数aを参照することができます。

インスタンス変数を隠ぺいする

コードの内容によっては参照してほしくない、という変数もあるかと思います。例えば複数の人間でコードを作成して自分の作成したコードをimportして他の人が使ってもらうようなときにはよく想定されるケースです。こんな時にはインスタンス変数を隠ぺい(マングリング)することで回避することが可能です。

こういった場合には変数の前にダブルアンダースコアを付けます。以下のようなコードになります。

実行します。

変数aは返ってきますが、__bは例外が発生して返ってきません。

このようにインスタンス変数の前にダブルアンダースコアを付与することでクラスの外からアクセスできないように隠ぺいすることができます。これをカプセル化ともいいます。

前後にダブルアンダースコアを付けると隠ぺいできない

次にインスタンス変数の前後にダブルアンダースコアを付けてみます。

実行します。

あ?インスタンス変数__c__が返ってきてしまいました。

__init__や__next__などのように前後に二つのアンダースコアがある場合は参照可能ですので注意しましょう。

隠ぺいしていてもアクセスできてしまう

といっても、隠ぺいしたインスタンス変数にアクセスできる方法があります。以下のコードの通りです。

実行します。

(インスタンス名)._(クラス名隠ぺいした)(クラス名)

の構文を取ると、アクセスが可能になります。

ですので、隠ぺいしても全くアクセスなるわけではないということを注意する必要があります。

 

まとめ

クラス内で定義するインスタンス変数の隠ぺいについて解説しました。この手法はクラスの手法の中でも大切な技術です。特に複数のメンバーでプロジェクトを開発し他の人のコードをimportして使うような場合に、アクセスしてほしくない場合、隠ぺいしておくということが大切になることもあるかと思います。

ネットには「隠ぺい」「マングリング」「カプセル化」というように一つの技術に異なった側面で名前をつけるので本当に混乱しますね。

 

ポリモーフィズム

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

連載目次

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

クラス

継承

ポリモーフィズム

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

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

クラスメソッド

名前空間

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

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

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