Public, Protected, Private変数のそれぞれの宣言方法
PythonのProtected変数は_(アンダースコア)が1つのもので、Private変数は_(アンダースコア)が2つのものである。
Public変数、Protected変数、Private変数には、それぞれ以下の特徴がある。

それぞれ、定義は以下のように行う。
Example
- 一般的な変数の定義(public変数)
def __init__(self, name, age):
self.name=name
self.age=age
- Protected変数(アンダースコアを1つつける)
def __init__(self, name, age):
self._name=name # _を1つつける
self._age=age # _を1つつける
- Private変数(アンダースコアを2つつける)
def __init__(self, name, age):
self.__name=name # _を2つつける
self.__age=age # _を2つつける
Public変数の具体的な使い方
Public変数には、クラス内、継承先、クラス外のインスタンスから直接アクセスすることができる
外部から自由にアクセスして変更することができるため利用には注意が必要で、外部から直接アクセスしない変数にはPublic変数を設定しない。
以下のように、Public変数は、クラス内、子クラス、インスタンスからアクセスできる。
Example
- Public変数の具体的な使い方
class Human:
msg = "Hello" # Publicクラス変数
def __init__(self, name, age):
self.name = name
self.age = age # Publicインスタンス変数
def print_msg(self):
print("{} name = {}, age = {}".format(self.msg, self.name, self.age))# Public変数にクラス内からアクセスできる
class SubHuman(Human):
def print_all(self):
print(self.msg, self.name, self.age) # 継承した子クラスでもpublic変数にはアクセスできる
### クラスの外 ###
taro = Human("Taro", 20)
jiro = Human("Jiro", 18)
print(taro.name) # クラス外からもアクセスできる
jiro.name = "suburo" # Public変数は直接編集できる
Protected変数の具体的な使い方
一般的に、Protected変数には、クラス内とクラス自身と継承したクラスのみからアクセスできる
ただし、Javaなどの言語のProtected変数と異なり、pythonでは、クラスの外からでもProtected変数にアクセスできる。
そのため、Protected変数にはクラス外からは直接アクセスしないように実装する。
(Example参照)
Example
- Protected変数の具体的な使い方
_msg = "Hello" # Protectedクラス変数
def __init__(self, name, age):
self._name = name
self._age = age # Protectedインスタンス変数
def print_msg(self):
print("{} name = {}, age = {}".format(self._msg, self._name, self._age))# Protected変数にアクセス
### クラスの外 ###
taro = Human("Taro", 20)
jiro = Human("Jiro", 18)
print(taro._name) # クラス外からでもアクセスできるが、Protected変数ではクラス外からのアクセスは非推奨で、実装しないようにする
jiro._name = "suburo" # またProtected変数を直接編集することもできる
Private変数の具体的な使い方
Private変数はアンダースコアを2つ付けて作成する。
Private変数はクラスの中からしかアクセスできないようになっており、クラスの外からアクセスしようとするとエラーになる。
ただし、Private変数も、特殊な方法(インスタンス名._クラス名変数名__変数名とすると)でクラスの外からアクセスできる。
Example
- Private変数の具体的な使い方
__msg = "Hello" # Privateクラス変数
def __init__(self, name, age, gender):
self.__name = name
self.__age = age # Privateインスタンス変数
self._gender = gender # Protectedインスタンス変数
def print_msg(self):
print("{} name = {}, age = {}".format(self.__msg, self.__name, self.__age))
# クラスの中からはアクセスできる
### クラスの外 ###
taro = Human("Taro", 20, 'Man')
jiro = Human("Jiro", 18, 'Man')
print(taro.__name) # これだとアクセスできずエラーになる(AttributeError: 'Human' object has no attribute '__name')
print(taro._Human__name) # Private変数だが、このように実装するとクラス外からもアクセスできるが実装しないようにする
jiro._Human__name = "saburo" # Private変数の書き換えもできる
print(jiro._Human__name)
jiro._Human__msg = "GoodBye"
print(jiro._Human__msg)
- 子クラスからのProtected, Private変数へのアクセス
class SubHuman(Human):
def __init__(self, name, age, gender):
super().__init__(name, age, gender)
def print_name(self):
print(self._gender) # Protected変数は継承先からも参照できる
print(self.__name) # Private変数は、継承先だとこのままアクセスできずエラー
sample = SubHuman("Shiro", 24, "man")
sample.print_name()
以上、PythonのProtected変数とPrivate変数について紹介した。