[解決済み] Pythonにはクラス内に「プライベート」変数がある?
質問
私は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
.
関連
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonコンテナのための組み込み汎用関数操作
-
PicgoのイメージベッドツールをPythonで実装する
-
Python jiabaライブラリの使用方法について説明
-
Python百行で韓服サークルの画像クロールを実現する
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
[解決済み] データ型が理解できない
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない