2

重複の可能性:
Python でのオブジェクト名の前の単一アンダースコアと二重アンダースコアの意味

プライベート変数リンクに関する Python ドキュメントを読んでいるときに質問がありました。

そのため、ドキュメントでは、プライベート変数にアンダースコアを付けて名前を付けるのが慣例であることが示されていますが、python はフィールドをプライベートにしません。

>>> class a():
      def __init__(self):
         self.public = 11
         self._priv = 12
>>> b = a()
>>> print b._priv
>>> 12

Pythonで変数を「真に」プライベートにする方法があるかどうか知りたいと思いました。

4

3 に答える 3

7
  • Guido van Rossum の言葉:私たちは皆大人です。
  • 拡張バージョン:私たちは皆大人です。必要に応じて、気軽に足を撃ってください。

必要に応じて少し非表示にすることもできますが、実際にはすべきではありません。

class NonAdult(object):
    def __init__(self):
        self.__private_number = '42'
    def __getattr__(self, name):
        if name.startswith('__private'):
            raise AttributeError

if __name__ == '__main__':
    na = NonAdult()
    print(na.__private_number) # raises AttributeError
    print(na.__dict__['_NonAdult__private_number']) # would still return 42
于 2013-01-05T05:06:57.377 に答える
4

いいえ、Python オブジェクトにはプライベート変数やメソッドはありません。「私たちは皆、ここでは同意している大人です」というフレーズは、一般的に、それらが不必要であると見なされていることを説明するために使用されます.

単一のアンダースコアが「プライベート」メンバーに使用されることがあり、慣例としてのみ購入します。機能的な目的はありません。

先頭の二重アンダースコアは名前マングリングを引き起こしますが、サブクラスでの名前の衝突を回避することだけを目的としています。「プライベートメンバーの安全性」は提供されませんが、まだアクセスできるからです。

于 2013-01-05T05:06:05.370 に答える