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のプライベート変数という概念のお話でした。
コメント