2012-02-04 18 views
14

プライベート関数を同じクラス内の他の関数から呼び出すにはどうすればよいですか?同じクラス内でプライベート関数を呼び出す

class Foo: 
    def __bar(arg): 
    #do something 
    def baz(self, arg): 
    #want to call __bar 

、私はこれを行う:

__bar(val) 

バズから()、私はこれを取得:

NameError: global name '_Foo__createCodeBehind' is not defined 

誰かがエラーの理由が何であるかを教えてもらえますか? また、別のプライベート関数からプライベート関数を呼び出すにはどうすればよいですか?

答えて

18

C/C++などのように暗黙的にthis->がPythonにありません。selfで呼び出す必要があります。

class Foo: 
    def __bar(self, arg): 
     #do something 
    def baz(self, arg): 
     self.__bar(arg) 

これらのメソッドは、しかし本当にプライベートではありません。メソッド名を2つのアンダースコアで始めると、Pythonはそれを "プライベート"にするためにいくつかの名前を変更しますが、それだけではありません。他の言語のように強制しません。 __barFooに定義すると、オブジェクトの外側からはFoo._Foo__barまでアクセスできます。たとえば、これを行うことができます:

f = Foo() 
f._Foo__bar('a') 

これは、エラーメッセージの「奇妙な」識別子についても説明しています。

hereはドキュメントにあります。

5

__barは(その名前がmangledされているという意味で)「プライベート」であるが、それはまだFooの方法ですので、あなたはself経由でそれを参照し、それにselfを渡す必要があります。裸の__bar()と呼んでも機能しません。そう呼ばなければならない:self.__bar()。だから... ...

>>> class Foo(object): 
... def __bar(self, arg): 
...  print '__bar called with arg ' + arg 
... def baz(self, arg): 
...  self.__bar(arg) 
... 
>>> f = Foo() 
>>> f.baz('a') 
__bar called with arg a 

あなたはどこでもあなたのFoo定義内self.__barにアクセスすることができますが、定義の外にいると、あなたはfoo_object._Foo__bar()を使用する必要があります。これは、クラス継承のコンテキストでの名前空間の衝突を回避するのに役立ちます。これがなぜこの機能を使用しているのではない場合、あなたはおそらくそれを誤って使用しているでしょう。

関連する問題