2014-02-27 4 views
0

개인 클래스 이름이 잘못된 이유를 설명 할 수 있습니까? 다음 클래스를 고려클래스의 개인 이름 감각은 무엇입니까

class A: 
    __a=32 
    def func(): 
     return a 

__a 여기에 클래스의 private 필드입니다. 그러나 __a에서 _A__a으로 이름을 바꾼 이유는 무엇입니까? 나는이 몸체에서 클래스 필드에 접근 할 수 없다면 파이썬에서 어떤 메소드가 어떤 것인지 이해하지 못한다.

+2

파이썬에는 비공개 필드가 없으며, 이름 변환이 있습니다. 이름 - mangling 원하지 않는 경우, 이중 밑줄로 시작하는 이름을 사용하지 마십시오. – BrenBarn

+0

@BrenBarn python 참조 설명서에서 : 클래스 정의에서 텍스트로 나타나는 식별자가 두 개 이상의 밑줄 문자로 시작하고 두 개 이상의 밑줄로 끝나지 않으면 해당 클래스의 ** 개인 이름 **으로 간주됩니다. –

+2

@DmitryFucintv convension에 의해 "고려 된"것이지만 실제로는 "개인적"이 아닙니다. – zhangxaochen

답변

4

이름 변환의 목적은 우발적 인 이름 충돌이 하위 클래스의 동일한 속성을 정의하는 것을 방지하기위한 것입니다. 이것은이 속성에 액세스하지 못하도록 과 아무 관련이 없습니다. 해당 언어 수준의 액세스 제어가 의미있는 보안 경계 인 것처럼하려는 경우 다른 언어를 사용하십시오. 파이썬의 좌우명은 "우리 모두는 성인에 동의하고있다"입니다.

어쨌든 구문을 수정하면 예제가 작동합니다. 이 클래스 A 정의 __a 버전을 액세스하기 때문에

class A(object): 
    __a = 32 
    def func(self): 
     return self.__a 

class B(A): 
    __a = 41 
    def bar(self): 
     return self.__a 

    def bar2(self): 
     return self._A__a 

print A().func() 
print B().func() 
print B().bar() 
print B().bar2() 

B().func()

여전히 32를 출력한다.

+0

좋은 설명, 좋은 설명을 위해서 –

+0

+1. 또한이 방법이 유용 할 수 있습니다. http://stackoverflow.com/questions/6930144/underscore-vs-double-underscore-with-variables-and-methods –

관련 문제