6

개인 변수에 액세스해야하는 데코레이터를 작성하고이 불일치를 발견했습니다. 아무도 이것을 설명 할 수 있습니까?파이썬 "개인"이름 맹 글링과 인스턴스 속성 대 클래스 속성

는 인스턴스 속성이 작동하지 않습니다 (그리고 이것은 우리가 바로 그것을 어떻게해야하는 방법이다 : 클래스에 정의 된 속성에 대한 예상대로

(파이썬 2.5)

이름 지정 작업을 맹 글링?)

>>> class Tester(object): 
...  def __init__(self): 
...   self.__foo = "hi" 

>>> t = Tester() 
>>> t._Tester__foo 
AttributeError: 'Tester' object has no attribute '_Tester__foo' 

PS "클래스 속성"은 이것들에 맞는 단어인가? 그들은 정적 아니지만, 당신이 그 중 하나를 목록, 또는 다른 가변 타입을 만들 경우,

업데이트 사실

, 두 번째 예제도 잘 작동 ... 공유됩니다. 하드웨어 문제였습니다 (다시 시작 도움이 됨).

+2

클래스 속성이 올바른 단어입니다. 그리고 그들은 항상 * 공유됩니다. 돌연변이는 중요하지 않습니다. 주어진 객체를 변형시킬 수 있는지 묻는 것을 제외하고는 거의 중요하지 않습니다. – delnan

+0

이 질문을 할 수 있습니까? 아니면 누군가 그것을 유지하는 가치를 보나요? 나는 원래의 문제를 재현 할 수 없다. 그것은 예상대로 작동하는 것 같습니다. – Rafe

+1

@MartijnPieters는 많은 파이썬 테스트에서이 문제를 테스트하는 데 모든 방법을 사용했기 때문에이 코드를 사용하지 마십시오. – jsbueno

답변

9

실제로는 이 아니며이 맞습니다.

이름 맹 글링은 클래스 생성시에 수행됩니다. 맹 글링 된 이름을 참조하는 모든 함수도 조정됩니다.

나는 적어도 파이썬 버전 2.4, 2.5, Mac에서 2.6, 3.1 및 3.2, 귀하의 예제를 재현 할 수없는

: 당신은 당신이 이름을 볼 수있는 기능 바이트 코드를 분해하면

>>> class Tester(object): 
...  def __init__(self): 
...   self.__foo = "hi" 
... 
>>> Tester()._Tester__foo 
'hi' 
>>> Tester().__foo 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'Tester' object has no attribute '__foo' 

가 엉망이되었습니다 뿐만 아니라 : 나는 compiler source모든 이름을 확인했습니다

>>> import dis 
>>> dis.dis(Tester.__init__) 
    3   0 LOAD_CONST    1 ('hi') 
       3 LOAD_FAST    0 (self) 
       6 STORE_ATTR    1 (_Tester__foo) 
       9 LOAD_CONST    0 (None) 
      12 RETURN_VALUE   

mangler, 적어도 2002 년 이후 동일하게 유지하고 코드 경로를 통해 실행됩니다.

네, 클래스 속성과 인스턴스 속성이 올바른 용어입니다. 클래스 속성은 항상 공유되지만 인스턴스의 속성이 인스턴스에 할당되는 에서으로 지정됩니다. 목록이나 다른 변경 가능한 객체를 변경하는 것은 속성 할당과 동일하지 않습니다.

+0

또한 3.2에서 작동합니다. – delnan

+0

당신이 옳습니다. 나는 그곳에서 무슨 일이 일어 났는지 전혀 모른다. 컴퓨터가 다시 시작되므로 IT 문제라고해야합니다. "다시 시도해 보셨습니까?" ;) – Rafe