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
属性 name
、age
、および SSN
を持つクラス Person
を作成しました。Person
クラスのインスタンス person1
を作成した後、構文 person1.name
、person1.age
、および person1 を使用して、クラス外の属性
name、
age、および
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 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