2017-02-12 11 views
0

Pythonのonline documentationには、下記の説明が含まれています。
誰かが意味することを説明してもらえますか?クラスのプライベートな名前は何ですか?

2.3.2. Reserved classes of identifiers

__*クラスのプライベート名。このカテゴリの名前は、 内でクラス定義のコンテキストを使用すると、マッチした フォームを使用するように書き直され、 の "private"属性と派生クラスの名前の衝突を避けるのに役立ちます。

答えて

2

classの内側に書かれたコードは、2つのアンダースコアで始まる名前を使用していますが、また2で終了していないコンパイラは、クラス名が含まれてマングルされた形でその名前を置き換えアンダーたび:

>>> class Foo(object): 
    __bar = None 
    def set_bar(self, v): 
     self.__bar = v 


>>> f = Foo() 
>>> f.set_bar(42) 
>>> f.__dict__ 
{'_Foo__bar': 42} 

実際には、サブクラスを作成するとき(サブクラスが基本クラスとは異なる名前を持つ場合)、ベースクラスで使用されるプライベート名と誤って衝突することはありません。

getattrを使用して 'プライベート'の値を取得することはできますが、セキュリティの仕組みではありません。また、名前の変更された形式であっても、同じ名前の派生クラスです。

+0

実際に 'f._Foo_bar'を使って直接取得できます。☺ – zmo

+1

@zmo、可能です。なぜ私には起こらなかったのですか?私の答えに追加されました。 – Duncan

関連する問題