Pythonでプライベート変数と関数(メソッド)を作成する

スポンサーリンク

Pythonでプライベート変数とメソッドを作成してみます。

Pythonでは、インスタンス変数、または関数(メソッド)へのアクセスを効果的に制限する仕組みがない。そのため、Pythonでは、保護されたプライベート アクセス指定子(クラスのメンバに対しての公開範囲を設定できる機能,スコープ(影響範囲))の動作をエミュレート(模倣)するために、変数、もしくは関数(メソッド)の名前の前に 1つまたは 2つのアンダースコア”_”を付ける規則が規定されている。

2つのアンダースコア”__” を付けると、プライベート変数になります。これは、クラスの外からその変数に触れない、またアクセスできないようにすることを強く示唆する。

■Python

今回は、Google Colaboratoryを用います。Google ColaboratoryのPythonのバージョンは、記事作成時点では「3.7.13」となっています。

■プライベート変数と関数(メソッド)を作成する

では、実際にプライベート変数と関数(メソッド)を作成してみます。まずは、プライベート変数から定義してみます。

※プライベートインスタンス属性という表現が出てきますが、インスタンス属性は設計図(クラス)で、設計図から実際に作られたものがインスタンスで、属性は空の箱のようなものであり、そこへ値を割り当てる。つまりは変数であるとも言えます。

■コード

class fruits:
  
  def __init__(self, name):
    self.__name = name #プライベートインスタンス属性

  def display_fruits(self):
    print("フルーツの名前: ", self.__name)

fruits(フルーツ)というクラス(設計図)という定義します。定義後、コンストラクター(Constructor)を定義するために、def文と特別な名前である「__init__()」を記述します。さらに括弧内には、特別な引数,パラメーターであるself(自己)とnameという引数,パラメータを記述します。記述後、self(自己)に対して、ドット(.)演算子を用いて、__nameというプライベート変数を定義し、”=(イコール)”を用いてname変数の値を代入する状態にしておきます。

その後、def文でdisplay_fruitsという関数(メソッド)を定義し、括弧内に引数,パラメータとしてself(自己)を設定します。この関数が呼び出された時に実行される処理としてはreturnとして、self(自己)に対しての__nameのプライベート変数を返すというものです。

■オブジェクトを介してプライベート変数にアクセスする

■コード

f_object = fruits("バナナ")

f_object.display_fruits() 

print(f_object.__name)

今回はf_objectという変数を定義し、その中でfruits()を用いて、オブジェクトを作成するプロセスである「インスタンス化」を行います。その際に、括弧内に引数,パラメータと「バナナ」という値を渡します。

その後、作成したオブジェクトを介して、display_fruits()にアクセスしてみます。さらに、作成したオブジェクトを介して、__nameのプライベート変数にもアクセスしてみます。

アクセスしてみると、display_fruits()が呼び出され、__init__()でセットした__nameのプライベート変数にアクセスすることができました。これは、特別な引数,パラメーターであるself(自己)を用いているため、Python クラス内にあるプロパティと関数(メソッド)にアクセスできる。

ところが、作成したオブジェクトを介して直接__nameのプライベート変数にアクセスすると、「AttributeError: ‘fruits’ object has no attribute ‘__name’(’fruits’ オブジェクトには ‘__name’ という属性がありません。)」というエラーが発生し、アクセスできない。

■プライベートの関数(メソッド)を定義する

では、次にプライベートの関数(メソッド)を定義してみます。

■コード

class fruits:
  
  def __init__(self, name):
    self.__name = name #プライベートインスタンス属性

  def __display_fruits(self): #プライベート関数(メソッド)
    print("フルーツの名前: ", self.__name)

f_object = fruits("バナナ")

f_object.__display_fruits()

先程のコードを変更し、def文で定義したdisplay_fruitsという関数(メソッド)を、2つのアンダースコア”__” を付けて__display_fruitsという関数(メソッド)にする。

その後、作成したオブジェクトを介して、__display_fruits()にアクセスしてみます。

アクセスすると、2つのアンダースコア”__” を付けたことにより__display_fruitsというプライベート関数(メソッド)が定義され、この関数は保護されており、「AttributeError: ‘fruits’ object has no attribute ‘__display_fruits’(’fruits’ オブジェクトには ‘__display_fruits’ という属性がありません。)」と出力されました。

コメント

タイトルとURLをコピーしました