1. ホーム
  2. python

Pythonのプライベートメンバー

2023-10-12 10:39:33

質問

Pythonでメソッドやデータメンバをprivateにするにはどうすればよいですか?それともPythonはプライベートメンバをサポートしていないのでしょうか?

どのように解決するのですか?

9.6. プライベート変数

「プライベート "インスタンス変数。 オブジェクトの内部からでなければアクセスできない は、Pythonには存在しません。 しかし、ほとんどのPythonのコードで守られている慣習があります。 ほとんどのPythonのコードで守られている慣習があります。 アンダースコアを先頭に持つ名前(例えば アンダースコアで始まる名前(例えば _spam)は、APIの非公開部分として扱われるべきです(それが関数であろうと、メソッドであろうと、あるいは関数であろうと、メソッドであろうと)。 関数であろうと、メソッドであろうと、データ メンバであろうと)。これは実装の詳細とみなされ 実装の詳細であり、予告なく変更されることがあります。 予告なく変更される可能性があります。

の有効な使用事例があるので クラスプライベートメンバーの有効な使用例(つまり、名前と名前の衝突を避けるため)があります。 名前と名前の衝突を避けるためです。 サブクラスによって定義された名前との名前の衝突を避けるためです)、このようなメカニズムに対するサポートは限られています。 このようなメカニズムに対するサポートは限られています。 ネームマングリングと呼ばれます。名前マングリングと呼ばれる限定的なサポートがあります。 という形式の識別子 (少なくとも2つのアンダースコアと 先頭のアンダースコアは少なくとも2つ、末尾のアンダースコアは少なくとも1つ という形式の識別子は,テキスト的に に置き換えられます。 _classname__spam で置き換えられます。 classname は現在のクラス名です。 で、先頭のアンダースコアは取り除かれます。 このマングリングは の構文上の位置に関係なく行われます。 識別子の構文上の位置に関係なく行われます。 このマングリングは、それがクラスの定義内に存在する限り、識別子の構文上の位置に関係なく行われます。

では は、例えば ,

class Test:
    def __private_symbol(self):
        pass
    def normal_symbol(self):
        pass

print dir(Test)

が出力されます。

['_Test__private_symbol', 
'__doc__', 
'__module__', 
'normal_symbol']

__private_symbol はプライベートメソッドとみなされるはずですが、それでも _Test__private_symbol .