Python のプライベートメソッド

Rayven Esplanada 2023年1月30日
  1. Python のプライベートアクセス修飾子
  2. Python でプライベートメソッドを宣言する
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つのアンダースコア __ を付けることで宣言されます。プライベートメソッドを宣言すると、メソッドをカプセル化クラス専用に予約できます。プライベートメソッドで別のクラスを拡張するクラスは、それらのメソッドを継承せず、アクセスしようとするとエラーをトリガーします。

Rayven Esplanada avatar Rayven Esplanada avatar

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

関連記事 - Python Class