Pythonのプライベート変数という概念のお話

Pythonでコーディングをしていて、ふと思った。
クラスをインスタンスで呼び出したり、割と便利なんだけどどの変数にもアクセスできるしpythonにおけるプライベート変数の考え方ってどうなってるの??

パブリック(public)変数
クラス外からでもどこからでもアクセスできる変数

プライベート(private)変数
変数を宣言したクラスやインスタンスでしか扱えない変数

目次

結論、pythonにプライベート変数は存在しない!?

結論を先に述べますと、pythonに本物のプライベート変数は存在しないということ。
プライベート変数として振る舞うプライベート変数(もどき)というものを扱うことはできますが...

さて、上述の内容がどういうことかと言いますと

パブリック変数の場合

クラス内に普通に宣言します。

class TestClass
    public_hensu = "I am public hensu"

tc = TestClass()
print(tc.public_hensu)

以下出力
>> I am public hensu

で、インスタンスを作成し、変数にアクセスします。
もちろんアクセスできます。うん当たり前。体操しちゃう。

慣習的に命名したプライベート変数

変数の前に_(アンダーバーを1つ)付けて宣言します。
これはプライベート変数だよっ!!って慣習的に命名したことになります。
可読性が上がるという意味でも利点がありますね。

class TestClass
    _public_hensu = "I am hensu like private"

tc = TestClass()
print(tc._public_hensu)

以下出力
>> I am hensu like private

ですが、慣習的に命名しただけなので、インスタンスからこの変数にはアクセスできてしまいます。
それは文句ないよね?

プライベート変数(もどき)

変数の前に__(アンダーバーを2つ)付けて宣言します。
こうすることで、クラス外からアクセスできません。アクセスしようとするとエラーになってくれます。
(しっかりとしたプライベート変数じゃん)

class TestClass
    __public_hensu = "I am hensu nearly private"

tc = TestClass()
print(tc.__public_hensu)

以下出力
エラーとなる
>> AttributeError: type object 'TestClass' has no attribute '__public_hensu'

しかーーーし、プライベート変数(もどき)というのも実は理由がありまして。

インスタンス名._クラス名__プライベート変数という形でこの変数にアクセスできてしまいます。

print(tc._TestClass__public_hensu)

以下出力
>> I am hensu nearly private

ということで、pythonにはしっかりとしたprivateな変数は存在しないんです!!ってことが言いたかっただけ。

ガチガチのプライベート変数っていつ使うの?どんな良いことがあるの?と考えてみると
まぁ別に純粋なプライベート変数って必要ないんじゃない?って思いました。
プライベート変数(もどき)くらいの立ち振舞いで全然オッケーだね〜って。

そんなPythonのプライベート変数という概念のお話でした。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

目次
閉じる