2012-02-04 17 views
14

Jak mogę wywołać funkcję prywatną z innej funkcji w obrębie tej samej klasy?Wywołanie funkcji prywatnej w tej samej klasie python

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

Teraz, kiedy to zrobić:

__bar(val) 

z Baz(), i uzyskać w ten sposób:

NameError: global name '_Foo__createCodeBehind' is not defined 

Czy ktoś może mi powiedzieć, co powodem tego błędu jest? Jak również mogę wywołać prywatną funkcję z innej prywatnej funkcji?

Odpowiedz

18

Nie ma ukrytych this-> w Pythonie takich jak w C/C++ itd. Musisz zadzwonić pod numer self.

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

te metody nie są naprawdę prywatny chociaż. Po uruchomieniu nazwy metody z dwoma podkreśleniami, Python wymienia nazwę, aby uczynić ją "prywatną" i to wszystko, co robi, nie wymusza niczego podobnego do innych języków. Jeśli zdefiniujesz __bar na Foo, będzie on nadal dostępny z zewnątrz obiektu poprzez Foo._Foo__bar. Na przykład, można to zrobić:

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

Wyjaśnia to „dziwne” identyfikator w komunikacie o błędzie dostałeś również.

Możesz go znaleźć w dokumentach here.

5

__bar jest „prywatny” (w tym sensie, że jego nazwisko zostało mangled), ale nadal jest to metoda Foo, więc trzeba odwoływać się do niej poprzez selfself i przekazać do niego. Po prostu wywołanie go z pustym __bar() nie będzie działać; musisz to tak nazwać: self.__bar(). Więc ...

>>> 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 

można uzyskać dostęp self.__bar gdziekolwiek w definicji Foo, ale gdy jesteś poza definicją, trzeba użyć foo_object._Foo__bar(). Pomaga to uniknąć kolizji przestrzeni nazw w kontekście dziedziczenia klas. Jeśli nie, dlaczego używasz tej funkcji, prawdopodobnie używasz jej niepoprawnie.

Powiązane problemy