Python クラスのプライベート変数

ここでは Python クラスのプライベート変数についてご説明します。

Python クラスのプライベート変数

Python のクラス定義では、self.変数名 のようにクラス変数を定義した場合、そのクラス変数はクラスの外から値の取得・変更できるパブリックな変数になります。

他のプログラミング言語では private などのキーワードで変数をプライベートにできたりしますが、Python にはクラス内からしかアクセスできないようなプライベート変数はありません。

ですが、多くの Python コードが従っているプライベートな変数であることを表す慣習があります。

クラス変数がプライベートであることを示したい時には、定義する際に、self.__変数名 のように前にアンダースコアを二個つけます。

そうすることによって、その変数名でクラスの外からアクセスしようとすると次のような AttributeError のエラーになります。

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def say_hello(self):
        print(f"Hello, I'm {self.name}!")


person1 = Person("Ryota", 20)
print(person1.__name)

実行結果は次のようになります。


ただ、気をつけないといけないのは、現在の実装ではクラス変数を定義する際に前にアンダースコアを二つつけた時に、Python のインタプリタが変数名を 「_クラス名__変数名」に変更しているだけなので、以下のようにするとクラスの外からでも値の取得・変更ができてしまいます

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def say_hello(self):
        print(f"Hello, I'm {self.name}!")


person1 = Person("Ryota", 20)
print(person1._Person__name)

person1._Person__name = "XXX"
print(person1._Person__name)

実行結果は次のようになります。

Ryota
XXX

Python の公式ドキュメントのにも以下のように書かれており、変数名の前にアンダースコアを二個つけても、完全にクラス外からアクセスできないプライベート変数になるわけではないのでご注意くださいね。クラスのメソッド名も全く同様です。

難号化の規則は主に不慮の事故を防ぐためのものだということに注意してください; 確信犯的な方法で、プライベートとされている変数にアクセスしたり変更することは依然として可能なのです。デバッガのような特殊な状況では、この仕様は便利ですらあります。(Python の公式ドキュメントの 9. クラス - 9.6. プライベート変数より抜粋)


以上、Python クラスのプライベート変数についてご説明しました。

© 2024 やさしい Python 入門