2011-09-30 13 views
7

関数/定数の先頭にアンダースコアが付いたコードがあります。 これは、これらが直接使用されないことを示しています。 クラスでこれを行うことはできますか?プライベートクラスの先頭にアンダースコアを付けるのが慣例ですか?

class _Foo(object): 
    pass 

class __Bar(object): 
    pass 
+3

'__'はPythonによって予約されています。これを使用しないでください。ほとんどの場合、名前のマングリングに問題が発生します。これを有用と考えるのを避けてください。これを「予約済み」と「一般用ではない」と「起こるのを待っている問題」と考えるようにしてください。そして、あなたの質問からそれを取り出してください。 –

+0

「プライベート」クラスとは何かを説明してください。ユースケースやこれを使用する状況を提供できますか? –

+0

ユーザーが使用する関数がエクスポートされます。これらの関数では、これらの「プライベート」クラスをインスタンス化します。 – canadadry

答えて

6

_の方が良い。これは、モジュール内で名前がプライベートであることを示します。

キャッチオールfrom <module> import *でインポートされず、「優先破棄」などの他の機能もあります。

hereから:

__all__が定義されていない場合は、パブリック名のセットは、アンダースコア 文字(「_」)で始まらないモジュールの名前空間で見つかったすべての名前 が含まれています。バージョン1.5以降で

、グローバルは名前が始まる 単一のアンダースコアと他のグローバルが削除される前に、そのモジュールから削除されているPythonの保証:hereから

ダブルアンダースコアの開始クラスメンバーはname-mangledです。

5

はい。単一のアンダースコアの使用法は、内部使用クラスのためにPEP8によって承認されています。

私は、クラス属性のアクティブなネームマングリングに使用されているので、二重アンダースコアの使用はほとんどの場合本当の効果を持つとは考えていません。一般に、クラスは別のクラスの属性ではありませんとなります。その場合、Pythonはあなたの名前をうまく利用できます)。

2

任意の変数の最初の文字として単一のアンダースコアを使用できますが、暗黙の意味としては "あなたが実際に何をしているのかわからない限りクラス/モジュール "(例えば、保護された/内部のもの)であり、from <module> import *を使用するとインポートされません。

二重アンダースコアを使用すると、クラス外では絶対にしてはいけないことがあります。そうしないと名前を変えることができませんでした(そして、 "できました"それは ")。

2

はい、これは規約に過ぎません。このモジュールからimport *を入力すると、アンダースコアで始まる名前はインポートされません。

+1

glglglの答えを参照してください。 - これは '__all__'が定義されていない場合のみです。あなたが望むなら、 '__all__'にアンダースコアの接頭辞付きの名前を含めることができます。 – agf

関連する問題