2011-02-04 2 views
5

나는 다음과 같은 코드가 있습니다public 메서드 안에있을 때 private 메서드를 호출 할 수없는 이유는 무엇입니까?

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

을하고 있는가?

+3

을 또한 : HTTP ://docs.python.org/tutorial/classes.html#private-variables 단일 밑줄은 "개인"변수의 일반적인 규칙입니다. MyClass 클래스를 상속받은 클래스에서 이름 충돌을 피하기 위해서는 일반적으로 두 개의 밑줄 만 사용해야합니다. 더블 언더 스코어는 네가 원했던 것일 수도있는 이름 맹 글링을 호출 할 것이지만, 네가 그것을 알고 있는지 확인하고 싶었다. ... –

+1

'__'을 사용하지 마십시오. 그것은 "name mangling"을 위해 예약되어 있습니다. Python은 내부 이름이 충돌하지 않도록하기 위해 내부적으로 수행합니다. –

답변

20

당신은 self이 필요합니다 : 당신이 것 같습니다처럼 파이썬

self.__private() 

클래스, 당신은 C#을/C++/자바에서오고있어 경우에 익숙해 걸릴. 이것은 아마도 사물의 "파이썬"방식을 도살하는 것이지만, 이렇게 생각하면 (나를 도왔습니다) :

각 클래스는 자체 내에 정의 된 네임 스페이스를 self으로 정의하고 이름없이 그 클래스의 인스턴스. 두 개의 밑줄이있는 "사적인"사물은 맹 글링되어 특별한 이름으로 부를 필요가 없지만 내면에서 간단히 을 사용할 수 있습니다.

Joe가 주석에서 언급했듯이 일반 개인 변수는 일반적으로 밑줄이 하나만있는 것으로 이름이 지정되며 두 개의 밑줄로 인해 하위 클래스에서 이름 충돌없이 상속이 가능합니다. Python에는 프라이버시가 적용되지 않습니다. 수업 외부의 개인 변수를 사용할 수 없다는 전적으로 관습입니다.

Thomas가 언급했듯이 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 그래, C++을하는 데 너무 많은 시간을 보냈기 때문에 PHP로 매번 나를 잡아 낸다. –

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() 
관련 문제