Pythonでプライベートメソッドを使用する場合


9

私はクラスを持っていますが、その中のすべてのメソッドはプライベートでなければなりません(フォーム__init__とは別__str__です)。すべてのメソッドを二重下線で表す必要がありますか、それとも悪い習慣と見なされますか?


Pythonのすべては公開されていると聞いています。それらをいつ使用するかは、自分で整理する必要があります。私はオブジェクト指向の高度な部分にはあまり興味がありませんが、これは私の頭に残っています。
ドラゴンズ

2
参考までに、名前のマングリングは、プライバシーのためではなく、一般的に使用される名前との衝突を回避するように設計されています。
2013年

@detlyの答えを正確に言うと、「一般的に使用される名前」ではなく、サブクラスで使用される名前です。「クラスプライベートメンバーには有効なユースケースがあるため(つまり、サブクラスで定義された名前と名前の名前の衝突を避けるため)、名前のマングリングと呼ばれるそのようなメカニズムのサポートは限られています。」docs.python.org/3/tutorial/classes.html#private-variables組み込み名との衝突を避けるために、末尾にアンダースコア(list_)を使用します。
Yaroslav Nikitenko

回答:


16

真のプライベートメソッド(クラスの外部から表示または使用できないメソッド)は、Pythonには存在しません。私たちが持っているものは、あなたがしてはいけないものに触れないようにするための単なる提案である慣習です。

プライバシーに最も近いのは名前のマングリングです。名前付きのMyClassの属性は内部的に名前__some_attrが変更されるだけなので_MyClass__some_attr、クラスの外部から参照するのは少し面倒です。これはめったに使用されません。ほとんどの人が行うことは_attr、何かに依存してはならず、パブリックインターフェイスの一部ではないという表記として、単一のアンダースコア()を単にプレフィックスとして付けることです。

識別子の前後に二重のアンダースコアを使用することは禁止されていませんが、内部の言語の詳細(「マジック」メソッドなど)のために予約されていると見なされます。新しい__attr__sを思いついてはいけません(インタープリターをハッキングしているのでない限り)。


10
これらのガイドラインはPep 8に文書化されています。
Brian

__some_attrクラスの外部でまったく参照されない場合はどうですか?二重の先行アンダースコアを使用しても問題ないでしょうか?
フェルミパラドックス

@ user5061-技術的には正しい使用ですが、眉をひそめています。それは内省をより困難にします。
Sean McSomething、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.