Python | カプセル化の方法
公開日:2021/6/7
Pythonには,オブジェクト指向プログラミングにおける概念の1つにカプセル化がある.カプセル化をすると,直接変数やメソッドにアクセスするのを制限したり,偶発的な変更を防ぐことができる.なお,カプセル化をする際には,"getter"(ゲッター),"setter"(セッター),"property","プライベート変数"を利用する.以下に2種類のカプセル化の方法を記す.
◆実施環境
Python 3.8.8
■カプセル化をした構文1
カプセル化をする際,"getter"と"setter","property","プライベート変数"は以下のように利用する.
・"getter": defの後に"get_変数名():"をつける
・"setter": defの後に"set_変数名():"をつける
・"property": 引数に"fget", “fset", “fdel", “doc"の4つを持つ.今回はgetterとsetterを指定する.
・"プライベート変数": 変数の前に"__"(2つのアンダースコア)をつける
# 1の処理
class Chocolate:
def __init__(self,maker,brand):
self.__maker = maker
self.__brand = brand
def get_maker(self): # getter使用
print('getter maker呼び出し')
return self.__maker
def get_brand(self): # getter使用
print('getter brand呼び出し')
return self.__brand
def set_maker(self,maker): # setter使用
print('setter maker呼び出し')
self.__maker = maker
def set_brand(self,brand): # setter使用
print('setter brand呼び出し')
self.__brand = brand
maker = property(get_maker,set_maker) # get makerとset makerが呼び出される
brand = property(get_brand,set_brand)
def print_msg(self):
print(self.maker,self.brand)
choco1 = Chocolate('Meiji','Fran')
choco1.maker = 'Glico' # setter maker呼び出し
choco1.brand = 'GABA' # setter brand呼び出し
print(choco1.maker) # getter maker呼び出し, 'Glico'出力
print(choco1.brand) # getter brand呼び出し, 'GABA'出力
■実行結果
# 1の結果
setter maker呼び出し
setter brand呼び出し
getter maker呼び出し
Glico
getter brand呼び出し
GABA
■カプセル化をした構文2
構文1とは異なり,構文2では"property"をデコレータとして使用することができる.
# 1の処理
class Chocolate:
def __init__(self,maker,brand):
self.__maker = maker
self.__brand = brand
@property
def maker(self): # getter使用
print('getter maker呼び出し')
return self.__maker
@property
def brand(self): # getter使用
print('getter brand呼び出し')
return self.__brand
@maker.setter
def maker(self,maker): # setter使用
print('setter maker呼び出し')
self.__maker = maker
@brand.setter
def brand(self,brand): # setter使用
print('setter brand呼び出し')
self.__brand = brand
choco1 = Chocolate('Meiji','Fran')
choco1.maker = 'Glico' # setter maker呼び出し
choco1.brand = 'GABA' # setter brand呼び出し
print(choco1.maker) # getter maker呼び出し, 'Glico'出力
print(choco1.brand) # getter brand呼び出し, 'GABA'出力
■実行結果
# 1の結果
setter maker呼び出し
setter brand呼び出し
getter maker呼び出し
Glico
getter brand呼び出し
GABA
以上