1. ホーム
  2. python

[解決済み] Pythonにはクラス内に「プライベート」変数がある?

2022-03-15 19:49:36

質問

私はJavaの世界から来たのですが、Bruce Eckelsの Python 3 パターン、レシピ、イディオム .

クラスについて読んでいると、Pythonではインスタンス変数を宣言する必要がないことが書かれています。コンストラクタで使うだけで、すぐに使えるようになります。

だから例えば

class Simple:
    def __init__(self, s):
        print("inside the simple constructor")
        self.s = s

    def show(self):
        print(self.s)

    def showMsg(self, msg):
        print(msg + ':', self.show())

もしそれが本当なら、クラス Simple の値を変更するだけでよいのです。 s をクラスの外部で使用することができます。

例えば

if __name__ == "__main__":
    x = Simple("constructor argument")
    x.s = "test15" # this changes the value
    x.show()
    x.showMsg("A message")

Javaでは、public/private/protected変数について教えられてきました。 これらのキーワードは、クラスの中で、クラス外の誰もアクセスできない変数が必要な場合があるからです。

Pythonではなぜそれが必要ないのですか?

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

それは文化的なことです。 Pythonでは、他のクラスのインスタンス変数やクラス変数に書き込むことはありません。 Javaでは、次のような場合、同じことをするのを妨げるものはありません。 本当に 結局のところ、クラス自体のソースを編集して、いつでも同じ効果を得ることができるのです。Pythonはそのようなセキュリティの見せかけを捨て、プログラマに責任を持つように促します。実際には、これは非常にうまく機能します。

何らかの理由でプライベート変数をエミュレートしたい場合は、いつでも __ のプレフィックスを使用します。 PEP 8 . Python は次のような変数名を混乱させます。 __foo を含むクラスの外側のコードから簡単に見えないようにするためです (ただし できる と同じように、決心すれば回避することができます。 できる Java のプロテクトは努力すれば回避できます)。

同じ規約で _ プレフィクスは 技術的に禁止されていなくても、近づかないでください。 . のような他のクラスの変数で遊んではいけません。 __foo または _bar .