2011-08-06 3 views
1

클래스에서 __variables에 액세스하려고하면 파서는 2 개의 밑줄이 현재 클래스에 비공개라고 가정합니다. 비 관련 함수가 "private"변수를 얻는 방법에 유의하십시오.클래스 변수가 아닌 Python 전용 클래스 변수

이것은 버그입니까?

 
>>> def f(): pass 
... 
>>> class A: 
...  def g(self): 
...    f.__x = 1 
...    def h(): 
...      pass 
...    h.__y = 2 
...    return h 
... 
>>> z = A().g() 
>>> dir(z) 
['_A__y', '__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get_ 
_', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new 
__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_ 
closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 
'func_name'] 
>>> dir(f) 
['_A__x', '__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get_ 
_', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new 
__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_ 
closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 
'func_name'] 

파이썬 2.5 3.2

+0

예상대로 작동합니다. 허락하신다면, 당신이 그들과 함께하는 일은 드물기는하지만, 그 속성은 클래스에 속합니다. – kwatford

답변

1

이것은 well documented behavior에서 테스트이다.

이 mangling은 클래스의 정의 내에서 발생하는 한 식별자의 통어 위치에 상관없이 수행됩니다.

+0

사실, 클래스 정의 밖에서 f .__ x를 정의하면 잘 작동합니다. 따라서 "f"는 프라이버시가 없습니다 (다른 이미 삭제 된 응답으로 불려 짐). 클래스 내에서 이러한 종류의 변수에 액세스 할 수 없습니다 (getattr/setattr 무시). – ubershmekel

+1

죄송합니다. 어떤 종류의 변수에 액세스합니까? '__'로 시작하는 변수는 무엇입니까? 나는 클래스 정의 밖에서'f .__ x '에 값을 할당하는 것은 실수라고 말한다. 단일 밑줄은 변수를 "개인"으로 표시하기에 충분합니다. 이름 맹 글링의 목적은 클래스 프라이머의 컨텍스트에서 프라이버시가 아니라 충돌 회피입니다. – senderle

+0

이 사실에 따르면, 네, 클래스 밖에서 두 개의 밑줄을 사용하는 것은 실수라는 데 동의합니다. 나에게 놀라운 결론 일 뿐이다. – ubershmekel