の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.setter
name()
_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++などの他の言語とは異なります。
Leave a Reply