2011-02-04 10 views
5

私は、次のコードを持っている:それは私に次のエラーを与えるしかしパブリックメソッド内にプライベートメソッドを呼び出せないのはなぜですか?

class MyClass: 
    def __private(self): 
     print "Hey man! This is private!" 

    def public(self): 
     __private() 
     print "I don't care if you see this!" 

if __name__ == '__main__': 
    x = MyClass() 
    x.public() 

を:

NameError: global name '_MyClass__private' is not defined

私が間違って何をしているのですか?あなたがself必要

+3

をもします。http:/ /docs.python.org/tutorial/classes.html#private-variables単一のアンダースコアは「プライベート」変数の一般的な規約です。 'MyClass'から継承したクラスで名前の衝突を避けたいときには、二重アンダースコアを使うのが普通です。二重アンダースコアはあなたがここで望んでいたかもしれないかもしれない名前のmanglingを呼び出すでしょうが、私はあなたがそれを知っていることを確認したいと思いました... –

+1

'__'を使用しないでください。これは、内部的な名前が決して衝突しないようにするために、内部的にPythonが行う「名前の変更」のために予約されています。 –

答えて

20

:pythonで

self.__private() 

クラスを使用すると、C#/ C++/Javaのから来ている場合は、あなたがしているように見えるように、慣れとります。これは恐らく文法の "無声"の方法を突き詰めているかもしれませんが、あなたはこのように考えることができます(それは私を助けました):

各クラスは、自身の中からselfと定義された名前空間を定義します。そのクラスのインスタンス2つのアンダースコアを持つ "プライベート"のものは、特別な名前で呼び出さないと、のように簡単に使用できます。

Joeが彼のコメントで述べたように、通常のプライベート変数は通常、単一のアンダースコアで名前が付けられています。二重のアンダースコアはそれをマングルするので、継承はサブクラスで名前の衝突なしに機能します。 Pythonにプライバシーを施行することはありません。クラス外のプライベート変数を使用することはできません。

トーマスが述べたように、selfも規約です。いずれかの方法についての方法は、最初のパラメータが渡された上で呼び出されていることをインスタンス(関数は、クラスの一部として宣言された)あなたは同じように簡単にこれを行うことができます:。

def __private(randomText): 
    print "Hey man! This is private!" 

def public(otherRandomText): 
    otherRandomText.__private() 
    print "I don't care if you see this!" 

をしかし、あなたはそれを行う場合論理の精神と優れたプログラミングスタイルが、あなたとあなたの子孫を永遠に揺るがせます。 (selfがより好ましい)。

すべてのpythonistasは修正したい/さらに説明しますか?

+0

そして今私は全部の馬鹿のように感じる。ありがとう! –

+2

それを心配しないでください男!私は何度もそれをやったことは分かりません。おそらく、言語を切り替えるたびに起こります。 – Crisfole

+2

@Bob @Cpfohl Yupは、PHPで毎回私を捉えています。ちょうど私がC言語を使って何年も過ごしたからです。 –

3

、あなたがこれをやりたい.__プライベート静的関数MyCallsを呼び出そうとしているされてあなたのコード:あなたがまだの場合は、ドキュメントのこのセクションを読んで、

class MyClass: 
    def __private(self): 
     print "Hey man! This is private!" 

    def public(self): 
     self.__private() 
     print "I don't care if you see this!" 

if __name__ == '__main__': 
    x = MyClass() 
    x.public() 
関連する問題