Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonプログラムのプライベート変数


このチュートリアルでは、プライベート変数について学習します。 Pythonのクラス

Pythonには、プライベート変数と呼ばれる概念がありません。 。ただし、ほとんどのPython開発者は、変数がパブリックではなくプライベートであることを示すために命名規則に従います。

変数名は二重アンダースコアで始める必要があります それをプライベート変数として表すため(実際にはそうではありません)。例:- 1つ、2つなど ..、。

すでに述べたように、名前が二重アンダースコアで始まる変数はプライベートではありません。引き続きアクセスできます。プライベート型変数を作成する方法を見てから、それらにアクセスする方法を見てみましょう。

# creating a class
class Sample:
   def __init__(self, nv, pv):
      # normal variable
      self.nv = nv
      # private variable(not really)
      self.__pv = pv
# creating an instance of the class Sample
sample = Sample('Normal variable', 'Private variable')

クラスとそのインスタンスを作成しました。 2つの変数があり、1つは通常で、もう1つは__init__メソッド内でプライベートです。次に、変数にアクセスしてみます。そして、何が起こるかを見てください。

# creating a class
class Sample:
   def __init__(self, nv, pv):
      # normal variable
      self.nv = nv
      # private variable(not really)
      self.__pv = pv
# creating an instance of the class Sample
sample = Sample('Normal variable', 'Private variable')
# accessing *nv*
print(sample.nv)
# accessing *__pv**
print(sample.__pv)

出力

上記のコードを実行すると、次の出力が得られます。

Normal variable
---------------------------------------------------------------------------
AttributeError                         Traceback (most recent call last)
<ipython-input-13-bc324b2d20ef> in <module>
      14
      15 # accessing *__pv**
---> 16 print(sample.__pv)
AttributeError: 'Sample' object has no attribute '__pv'

プログラムはエラーなしでnv変数を表示しました。しかし、 AttributeErrorが発生しました __ pvにアクセスしようとしたとき 変数。

なぜこのエラーが発生するのですか?変数名が__pvの属性がないため 。では、 self .__ pv =pv はどうですか? initメソッドのステートメント?これについては後で説明します。まず、__ pvにアクセスする方法を見てみましょう 変数。

名前が二重アンダースコアで始まるクラス変数にアクセスできます _className \ _variableName _として 。したがって、例では _Sample \ _pv _ 。次に、 _Sample \ _pv_を使用してアクセスします 名前。

# creating a class
class Sample:
   def __init__(self, nv, pv):
      # normal variable
      self.nv = nv
      # private variable(not really)
      self.__pv = pv
# creating an instance of the class Sample
sample = Sample('Normal variable', 'Private variable')
# accessing *nv*
print(sample.nv)
# accessing *__pv** using _Sample__pv name
print(sample._Sample__pv)

出力

上記のコードを実行すると、次の結果が得られます。

Normal variable
Private variable

変数の名前が__pvである理由 変更されましたか?

Pythonには、名前マングリングと呼ばれる概念があります。 Pythonは、二重アンダースコアで始まる変数の名前を変更します 。したがって、名前が二重アンダースコアで始まるクラス変数は、 _className \ _variableName _の形式に変更されます。

したがって、この概念はクラスのメソッドにも適用されます。次のコードで確認できます。

class Sample:
   def __init__(self, a):
      self.a = a

   # private method(not really)
   def __get_a(self):
      return self.a
# creating an instance of the class Sample
sample = Sample(5)
# invoking the method with correct name
print(sample._Sample__get_a())
# invoking the method with wrong name
print(sample.__get_a())

出力

上記のコードを実行すると、次の結果が得られます。

5
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-19-55650c4990c8> in <module>
      14
      15 # invoking the method with wrong name
---> 16 print(sample.__get_a())
AttributeError: 'Sample' object has no attribute '__get_a'

結論

二重アンダースコアを使用する目的 変数またはメソッドへのアクセスを制限するものではありません。これは、特定の変数またはメソッドがクラス内でのみバインドされることを意図していることを示しています。チュートリアルに質問がある場合は、コメントセクションにそのことを記載してください。


  1. Pythonプログラムのカレンダー

    Python カレンダーと呼ばれる組み込みモジュールがあります カレンダーを操作します。 カレンダーについて学習します この記事のモジュール。 カレンダーの週 モジュールは月曜日に開始します 日曜日に終了します 。モジュールカレンダーはグレゴリオ暦に従います カレンダー。 カレンダーの便利な方法をいくつか見てみましょう モジュール。 年間カレンダーの取得 特定の年のカレンダーを取得する必要がある場合は、クラス calendar.calendar(year)のインスタンスを作成します。 そしてそれを印刷します。一例を見てみましょう。 例 # importing the calendar m

  2. クイックソート用のPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −配列が与えられたので、クイックソートの概念を使用して配列を並べ替える必要があります ここでは、最初に配列をパーティション化し、別のパーティションを並べ替えて、並べ替えられた配列を取得します。 次に、以下の実装のソリューションを見てみましょう- 例 # divide function def partition(arr,low,high):    i = ( low-1 )    pivot = arr[high] # pivot element   &nb