2012-02-04 3 views
14

어떻게 같은 클래스 내의 다른 함수로부터 private 함수를 호출 할 수 있습니까? 나는이 작업을 수행 할 때동일한 클래스 내 private 함수 호출하기

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

지금 :

NameError: global name '_Foo__createCodeBehind' is not defined 

누군가가 나에게 오류의 원인이 무엇인지 말해 줄 수 : 바즈에서

__bar(val) 

는(), 난이 얻을? 또한 어떻게 다른 개인 함수에서 개인 함수를 호출 할 수 있습니까?

답변

18

C/C++ 등에서와 같이 암시 적으로 this->이 Python에 없습니다. self에서 호출해야합니다.

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

이러한 방법은 비록 정말 개인 없습니다. 메소드 이름을 두 개의 밑줄로 시작하면 파이썬은 그것을 "비공개"로 만들기 위해 일부 이름을 변경합니다. 그게 전부 일 뿐이며, 다른 언어처럼 아무 것도 시행하지 않습니다. __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()을 사용해야합니다. 이렇게하면 클래스 상속 컨텍스트에서 네임 스페이스 충돌을 피할 수 있습니다. 이것이이 기능을 사용하는 이유가 아닌 경우 잘못 사용했을 가능성이 큽니다.

관련 문제