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
以上


