Python | カプセル化の方法

2021年6月7日

公開日: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

以上