私は Java の世界から来て、Bruce Eckels のPython 3 Patterns, Recipes and Idiomsを読んでいます。
クラスについて読んでいると、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 ではなぜそれが必要ないのでしょうか?
ベストアンサー1
これは文化的なことです。Python では、他のクラスのインスタンスやクラス変数に書き込むことはありません。Java では、本当にそうしたいのであれば、同じことを行うことを妨げるものは何もありません。結局のところ、クラス自体のソースを編集すれば、同じ効果を得ることができます。Python は、セキュリティの見せかけを捨て、プログラマーに責任を持たせることを推奨しています。実際には、これは非常にうまく機能します。
何らかの理由でプライベート変数をエミュレートしたい場合は、常に__
接頭辞を使用できます。ペップ8Python は、変数名を次のように変更して__foo
、その変数を含む名前空間の外部のコードから簡単には見えないようにします (ただし、努力すれば Java の保護を回避できるのと同じように、十分な決意があれば回避できます)。
同じ規則により、_
プレフィックスは、たとえ技術的に他の場所からアクセスできないようにされていない場合でも、クラス (またはモジュール) 内でのみ内部的に使用する必要があります。または の_variable
ような他のクラスの変数をいじってはいけません。__foo
_bar