2012-12-26 3 views
0

파이썬 모듈 m1이 있습니다. bpython에서 다음파이썬에서`conventional` 개인 변수에 접근하는 방법은 무엇입니까?

# m1.py 
class C1(object): 
    def __init__(self): 
     self.__pri = 10 
     self._pro = 5 
     self.pub = 1 

>>> import m1 
>>> c = m1.C1() 
>>> c.__pri 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
AttributeError: 'C1' object has no attribute '__pri' 
>>> c._pro 
5 
>>> c.pub 
1 
>>> dir(c) 
['_C1__pri', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_pro', 'pub'] 
>>> c._C1__pri 
10 

나는 파이썬에서 private 변수의 어떤 개념이 없다 생각했다. 우리는 어떻게이 행동을 지금 설명 할 수 있습니까?

편집 : 나는 c .__ pri에 곧바로 액세스 할 것으로 예상했지만, name mangling은 내가 아래 답변처럼 그것을하지 못하게합니다. 모두에게 감사드립니다!

+0

우리에게 무엇을 원하십니까?) 예, 이렇게 작동합니다. – alexvassel

+0

여기서 무엇을 기대하셨습니까? –

+2

이것은 광범위하게 문서화되어 있습니다 (http://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references). 이렇게 질문하기 전에 몇 가지 조사를 해보십시오. – l4mpi

답변

5

이중 밑줄

c._C1__pri 

가 속성에 대한 액세스를 허용 하나의 밑줄 접두사, 속성과 클래스 이름을 미치게. 일종의 가상 개인 정보 보호 정책이지만 다른 용도로 사용됩니다. c.__private과 (과) 어떻게 될지 잘 모르겠습니다. 나는 결과가 동일했을지라도 당신이 c.__pri 일을 의미한다고 생각합니다.

__pri 속성은 클래스 외부에서 액세스 할 수 있기 때문에 비공개가 아닙니다. 그렇게하려면 약간의 문자 만 있으면됩니다.

아래에 언급 된 jadkik94와 마찬가지로, 이것은 액세스가 불가능한 것이 아니라 다른 프로그래머에게 속성을 사용해서는 안된다는 신호입니다. 상속

class Parent: 
    def __method(self): 
     print 'Parent method' 

class Child(Parent): 
    def __method(self): 
     print 'Child method' 

>>> c = Child() 
>>> c._Child__method() 
Child method 
>>> c._Parent__method() 
Parent method 

이중 밑줄이 이름의 우발적 최우선 방지를 사용할 때 편리하게 사용할 수 있습니다

참고로 다른 시간 (이 매우 자주 볼하지 않는 것이)입니다. 전용 반원 선언

+2

당신은이 점의 전체적인 점은 ** 당신이 "이것을 사용할 필요가 없어야합니다."와 같이 "당신은 이것을 사용할 수 없습니다"와 같이 사적인 것임을 ** 언급하지 말아야합니다. – jadkik94

+0

@ jadkik94 나는 당신의 의견을 좋아합니다. 아주 많이 말하고있어. Thx – Aleyna

+0

@ xhainingx 답을 자세히 설명해 주셔서 대단히 감사드립니다. – Aleyna

1

Name Mangling

이것은 방법을 제공한다.

이 두 개의 밑줄 이름 변경은 하위 클래스의 내부 전용 변수 덮어 쓰기를 방지하는 데 도움이됩니다.

멤버 변수를 사용해서는 안되는 것을 보여주는 일반적인 방법은 하나의 밑줄로 처리하는 것이지만, 이는 단지 규칙 일뿐입니다.

1

관찰중인 것은 name mangling입니다. 두 개의 선행 밑줄과 하나의 후행 밑줄이있는 변수의 이름은 하위 클래스와의 우발적 인 충돌을 방지하고 임시 필드가 개인 필드를 수정하지 못하도록 이름이 바뀝니다.

그러나 변수 이름이 맹 글링 후 무엇인지 판단하기가 쉽기 때문에 결정된 병적 인 사용자를 포기하지는 않습니다.