Articles

のpublic、protected、privateメンバー Python-Public、Protected、Privateメンバー

C++やJavaなどの古典的なオブジェクト指向言語は、public、private、およびprotectedキーワードによってクラスリソースへのアク クラスのプライベートメンバーは、クラス外の環境からのアクセスが拒否されます。 これらはクラス内からのみ処理できます。

パブリックメンバー

パブリックメンバー(通常はクラスで宣言されたメソッド)は、クラスの外部からアクセスできます。 Publicメソッドを呼び出すには、同じクラスのオブジェクトが必要です。 プライベートインスタンス変数とパブリックメソッドのこの配置は、データのカプセル化の原則を保証します。

Pythonクラスのすべてのメンバーは、デフォルトでpublicです。 任意のメンバーは、クラス環境の外部からアクセスできます。 P>

例:パブリック属性

コピー

class Student: schoolName = 'XYZ School' # class attribute def __init__(self, name, age): self.name=name # instance attribute self.age=age # instance attribute

Studentクラスの属性にアクセスし、以下に示すようにその値を変更することができます。

例: アクセスパブリックメンバー

コピー

>>> std = Student("Steve", 25)>>> std.schoolName'XYZ School'>>> std.name'Steve'>>> std.age = 20>>> std.age25

保護されたメンバー

クラスの保護されたメンバーは、クラス内からアクセ 他の環境はアクセスを許可されていません。 これにより、親クラスの特定のリソースを子クラスに継承できるようになります。 インスタンス変数を保護するためのPythonの規則は、接頭辞_(単一のアンダースコア)を追加することです。 これにより、サブクラス内からでない限り、アクセスされることが効果的に防止されます。

例: 実際、これはインスタンス変数がインスタンスにアクセスしたり変更したりするのを妨げるものではありません。 次の操作は引き続き実行できます。

例:保護されたメンバーへのアクセス

コピー

>>> std = Student("Swati", 25)>>> std._name'Swati'>>> std._name = 'Dipa'>>> std._name'Dipa'

ただし、以下に示すように、プロパティデコレータを使用してプロパティを定義し、それを保護することができます。

例: 保護された属性

コピー

class Student:def __init__(self,name):self._name = name@propertydef name(self):return [email protected] name(self,newname):self._name = newname

上記の@propertyデコレータを使用して、name()@name.settername()_nameは保護されています。

例:アクセス保護されたメンバー

コピー

>>> std = Student("Swati")>>> std.name'Swati'>>> std.name = 'Dipa'>>> std.name'Dipa'>>> std._name # still accessible

上記では、std.name_name属性を変更しました。 しかし、それはまだPythonでアクセス可能です。 したがって、責任あるプログラマは、クラスの外部から_接頭辞が付いたインスタンス変数にアクセスしたり変更したりすることは控えま

広告

プライベートメンバー

Pythonには、インスタンス変数やメソッドへのアクセスを効果的に制限するメカニズムはありません。 Pythonは、protectedおよびprivateアクセス指定子の動作をエミュレートするために、変数/メソッドの名前の前に単一または二重のアンダースコアを付ける規則を規定し 変数に接頭辞が付いたダブルアンダースコア__はプライベートになります。 それはクラスの外からそれに触れないように強い提案を与えます。 これを実行しようとすると、AttributeErrorが発生します。

例:プライベート属性

コピー

class Student: __schoolName = 'XYZ School' # private class attribute def __init__(self, name, age): self.__name=name # private instance attribute self.__salary=age # private instance attribute def __display(self): # private method print('This is private method.')
例:

コピー

>>> std = Student("Bill", 25)>>> std.__schoolNameAttributeError: 'Student' object has no attribute '__schoolName'>>> std.__nameAttributeError: 'Student' object has no attribute '__name'>>> std.__display()AttributeError: 'Student' object has no attribute '__display'

pythonはプライベート変数の名前マングリングを実行します。 二重アンダースコアを持つすべてのメンバーは、_object._class__variableに変更されます。 だから、それはまだクラスの外からアクセスすることができますが、練習は控えるべきです。 したがって、Pythonはpublic、protected、privateアクセス修飾子の概念的な実装を提供しますが、C#、Java、C++などの他の言語とは異なります。