Python のプライベートメソッド
このチュートリアルでは、Python でプライベートメソッドを宣言、操作、および利用する方法を示します。
private
は、オブジェクト指向プログラミング言語で使用されるアクセス修飾子のタイプのキーワードです。アクセス修飾子は、関数または変数の可視性をある程度制限します。関数/変数をプライベートとして宣言すると、それをカプセル化するクラスへのアクセスのみが制限されます。
私的な方法との実際の比較は、家庭用照明システムです。電灯のスイッチと電球は、人が直接アクセスして見ることができるため、公共の方法のようなものです。同時に、保護ゴム内の電線は、改ざんされない限り一般的には見えないため、私的な方法ですが、ほとんどの場合、注意を払わずに仕事をしています。
Python のプライベートアクセス修飾子
Python では、プライベートメソッドは、宣言されているクラスの外部や他の基本クラスにアクセスできないメソッドです。
Python でプライベートメソッドを宣言するには、メソッド名の先頭に二重アンダースコアを挿入します。
__init__()
メソッド
Python の注目すべきプライベートメソッドは __init__()
メソッドです。これは、クラスオブジェクトのクラスコンストラクターとして使用されます。このメソッドは、メソッドの引数に応じて、クラスのオブジェクトがインスタンス化されるときに呼び出されます。
たとえば、2つのフィールドと __init__()
メソッドを持つクラス Person
を宣言します。
class Person:
name = ""
age = 0
def __init__(self, n, a):
self.name = n
self.age = a
ここで、クラスの外部でプライベート __init__()
メソッドにアクセスするには、インスタンス化した後、クラス自体のオブジェクトからアクセスする必要があります。
たとえば、同じディレクトリ内の別のファイルで、Person
クラスのインスタンスを作成し、クラス名を使用してコンストラクターを呼び出します。
from personClass import Person
sys.path.append(".")
person = Person("John Doe", 25)
print(person.name, person.age)
出力:
John Doe 25
sys.path.append()
を使用します。この場合、両方のファイルが同じフォルダにあるため、ピリオド .
十分なものです。その後、.py
ファイル(personClass.py
)からクラス(Person
)をインポートします。__init__()
メソッドは、Person
クラスを変数にインスタンス化してオブジェクトを再インスタンス化した後、明示的に呼び出すことができます。
例えば:
person = Person("John Doe", 25)
person.__init__("Jane Doe", 29)
print(person.name, person.age)
出力:
Jane Doe 29
また、__init()__
メソッドは、クラス自体から呼び出すことで明示的に呼び出すことができます。このアプローチでは、最初のパラメータ self
を引数に明示的に配置する必要があります。
person = Person("John Doe", 25)
Person.__init__(person, "Jack Sparrow", 46) # person is the 'self' argument
print(person.name, person.age)
出力:
Jack Sparrow 46
これらのアプローチはすべて、__init__()
メソッドのプライベートプロパティを保持します。
これで、この組み込みメソッドが分析されました。実際に私たち自身のプライベートメソッドをクラスに実装し、そのアクセスをパブリックメソッドから区別することに移りましょう。
Python でプライベートメソッドを宣言する
プライベートメソッドを宣言するには、問題のメソッドの前に二重下線 __
を付けます。それ以外の場合は、デフォルトのパブリックメソッドとして扱われます。
前の例から Person
クラスを拡張し、Person
クラスに基づいてコンストラクターを作成するサブクラス Employee
を作成しましょう。
また、person クラス内に public メソッドと private メソッドの 2つの新しいメソッドを作成します。
class Person:
name = ""
age = 0
def __init__(self, name, age):
self.name = name
self.age = age
def walk(self):
print("Walking")
def __call(self):
print("Taking a call")
次に、Person
を拡張する派生クラスまたはサブクラス Employee
を作成します。
class Employee(Person):
occupation = "Unemployed"
salary = 0
def __init__(self, name, age, occupation, salary):
Person.__init__(self, name, age)
self.occupation = occupation
self.salary = salary
def work(self):
print("Employee is working")
self.walk()
def takeCall(self):
self.__call()
print("Employee is taking a call")
Person
クラスです。このクラスでは、work()
メソッドと takeCall()
メソッドは、それぞれ親クラス Person
から walk()
クラスと __call()
クラスを外部から呼び出します。
もう 1つのメソッドは外部からパブリックメソッドを呼び出し、もう 1つのメソッドは親クラスからプライベートメソッドを呼び出します。実行したときにこの動作がどのように機能するかを見てみましょう。
たとえば、上記のクラス宣言があるとします。
employee_1 = Employee("John Doe", 25, "Software Engineer", 40000)
employee_1.work()
employee_1.takeCall()
出力:
Employee is working
Walking
Traceback (most recent call last):
File "python/demo.py", line 35, in <module>
employee_1.takeCall()
File "python/demo.py", line 29, in takeCall
self.__call()
AttributeError: 'Employee' object has no attribute '_Employee__call'
work()
メソッドの呼び出しが正常に実行され、work()
および walk()
メソッドからステートメントが出力されます。ただし、takeCall()
を呼び出すと、Person
クラスの __call()
メソッドが Employee
クラスのメソッドとして認識されないため、AttributeError
がトリガーされます。クラスを別のクラスに拡張する場合、拡張機能に独自のプライベートメソッドは含まれません。
要約すると、Python のプライベートメソッドは、メソッドの前に 2つのアンダースコア __
を付けることで宣言されます。プライベートメソッドを宣言すると、メソッドをカプセル化クラス専用に予約できます。プライベートメソッドで別のクラスを拡張するクラスは、それらのメソッドを継承せず、アクセスしようとするとエラーをトリガーします。
Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.
LinkedIn