Python のプライベート変数

Aditya Raj 2023年1月30日
  1. Python のプライベート変数とは何ですか
  2. Python でプライベート変数を実装する方法は
  3. Python でプライベート変数にアクセスする
  4. Python プライベート変数の結論
Python のプライベート変数

プライベート変数は、アクセス制御用のプログラムで使用されます。Java や C++ などのプログラミング言語では、プライベート変数を定義するためのキーワードが指定されています。

Python には、プライベート変数を定義するためのキーワードはありません。この記事では、プライベート変数を実装し、クラスの名前を使用してそれらにアクセスする方法について説明します。

Python のプライベート変数とは何ですか

Python でプライベート変数を作成することはできませんが、特別な命名規則を使用してプライベート変数の実装をシミュレートすることはできます。

構文 objectName.attributeName を使用して、オブジェクトの任意の属性にアクセスできます。例を見てください。

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.SSN = SSN


person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1.SSN)

出力:

Name of the person is: Alex
Age of the person is: 15
SSN of the person is: 1234567890

属性 nameage、および SSN を持つクラス Person を作成しました。Person クラスのインスタンス person1 を作成した後、構文 person1.nameperson1.age、および person1 を使用して、クラス外の属性 nameage、および SSN にアクセスしました。.SSN

クラス定義の外部で SSN にアクセスすることは望ましくありません。Python でプライベート変数を作成するためのキーワードはありません。では、プライベート変数の実装をどのようにシミュレートする必要がありますか?

Python でプライベート変数を実装する方法は

Python でプライベート変数を実装するには、変数名の前に二重アンダースコア (__) を使用します。二重アンダースコアを使用して、Person クラスの属性 SSN を定義しましょう。

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.__SSN = SSN

Person クラスのインスタンス person1 を作成し、構文 person1.__SSN を使用して属性 __SSN にアクセスすると、プログラムはエラーを表示し、以下の AttributeError 例外を発生させます。

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.__SSN = SSN


person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1.__SSN)

出力:

Name of the person is: Alex
Age of the person is: 15
/usr/lib/Python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.7) or chardet (3.0.4) doesn't match a supported version!
  warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/PythonProject/string1.py", line 11, in <module>
    print("SSN of the person is:", person1.__SSN)
AttributeError: 'Person' object has no attribute '__SSN'

__SSN 以外の他のすべての属性にアクセスできます。プログラムは、__SSN という名前の属性はないと言っています。では、属性 __SSN の値にアクセスするにはどうすればよいですか?

Python でプライベート変数にアクセスする

クラス定義の外部でプライベート変数にアクセスすることはできませんが、内部でアクセスすることはできます。したがって、クラス内にプライベート変数値にアクセスするためのメソッドを作成できます。

以下に示すように、属性 __SSN の値を返す getSSN() という名前のメソッドを作成できます。

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.__SSN = SSN

    def getSSN(self):
        return self.__SSN


person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1.getSSN())

出力:

Name of the person is: Alex
Age of the person is: 15
SSN of the person is: 1234567890

メソッドを定義する代わりに、プライベート変数に直接アクセスできます。プライベート変数がメモリにどのように格納されるかを見てみましょう。二重アンダースコア(__)を使用して変数名を定義すると、Python インタープリターはそのような属性はないと言います。

変数がどのように格納されるかを理解するために、指定されたオブジェクトのすべての属性をチェックします。dir() 関数を使用します。この関数は、オブジェクトまたは入力引数を受け取り、すべてのオブジェクト属性のリストを返します。dir() 関数を使用して、person1 オブジェクトの属性を確認してみましょう。

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.__SSN = SSN

    def getSSN(self):
        return self.__SSN


person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Attributes of the Person are:")
print(dir(person1))

出力:

Attributes of the Person are:
['_Person__SSN', '__doc__', '__init__', '__module__', 'age', 'getSSN', 'name']

name 属性と age 属性が存在するが、__SSN 属性がないことを確認してください。ただし、_Person__SSN という名前の属性があります。オブジェクト person1 のこの属性の値を出力してみましょう。

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.__SSN = SSN

    def getSSN(self):
        return self.__SSN


person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1._Person__SSN)

出力:

Name of the person is: Alex
Age of the person is: 15
SSN of the person is: 1234567890

属性 _Person__SSN__SSN と同じ値であることに注意してください。属性 __SSN は、プログラムに _Person__SSN として保存されます。属性 __SSN にアクセスするたびに、プログラムは AttributeError 例外に遭遇します。

Python では、二重アンダースコア(__)を使用して属性を定義すると、プログラムは属性名の前に _className を追加します。このプロセスはマングリングと呼ばれます。

Python は、二重アンダースコアを使用して名前が付けられた属性がマングリングのプライベート変数であることを認識します。ただし、構文 _className__attributeName を使用して変数にアクセスできるため、これは当てはまりません。

Python プライベート変数の結論

この記事では、Python のプライベート変数について説明しました。他のプログラミング言語とは異なり、Python でプライベート変数を宣言するための特定のキーワードがないことを確認しました。ただし、二重下線文字を使用して変数に名前を付けることにより、プライベート変数の実装をシミュレートできます。

また、Python でプライベート変数にアクセスする 2つの方法についても説明しました。メソッドを使用してプライベート変数にアクセスすることをお勧めします。クラス名でアプローチを使用すると、変数に直接アクセスするため、プライベート変数を実装する本質が失われます。プログラムは、属性名の前に _className を使用してプライベート変数にアクセスするように警告します。

著者: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.

GitHub

関連記事 - Python Variable