2012-06-28 3 views
2

다른 이름을 가진 기본 클래스의 메서드를 재정의하는 방법의 예를 보았습니다. how 및 이 가능한 이유는 무엇입니까? 아마도 어떤 용도로 사용할 수 있을까요?_ <parent_class><__ method_name> 패턴이 부모 <__ method_name>을 (를) 재정의합니다. 이유가 무엇입니까?

>>> class A(object): 
... def foo(self): 
...  self.__bar() 
... def __bar(self): 
...  print "original" 
... 
>>> class B(A): 
... def _A__bar(self): 
...  print "overridden" 
... 
>>> B().foo() 
overridden 
+0

[파이썬 이름 맹 글링] 결과 (http://docs.python.org/reference/ expressions.html # atom-identifiers). – brandizzi

+0

@MartijnPieters : 나는 복제본에 동의하지 않습니다. 행동의 원인은 맹 글링 (mangling)의 이름이지만 문제는 다릅니다. – MattH

+0

@MattH : 답은 대략 동일합니다. 원인은 동일합니다. 미묘하게 다른 100 개의 질문과 답변을함으로써 우리는 너무 희석되어 사람들이 이미 그 답을 찾기가 더 어려워지고 있습니다. –

답변

3

와우, 정말 끔찍합니다.

A에있는 __bar 메서드는 파이썬에서 "개인"함수를 시뮬레이트하는 가장 기본적인 방법이므로 이름이 엉망입니다. 하지만 실제로는 비공개가 아니며 단지 접두사가 _classname입니다. 따라서 여기의 코더는 A의 소위 개인 메서드를 재정의하기 위해이 기능을 이용합니다.

이 방법이 효과적이나 그렇지는 않습니다. 어쨌든 이중 밑줄 개인 속성은 거의 사용하지 않아야하지만, 다른 논의입니다.

+0

"이 방법이 효과적이나 그렇지는 않습니다."- 가끔은 기본 클래스가 나온 패키지를 유지하지 않을 때가 있습니다. –

+0

@ bruno 나는 동의하지 않지만 내 말씨는 정확합니다. 당신이 *해서는 안됩니다. –

3

이것은 클래스가 우연히 하위 클래스의 속성과 섞이지 않도록하기위한 것입니다. 이것은 흔히 __ 접두어가 붙은 속성을 자주 보지 못하는 이유입니다. (대부분 자바 프로그래머가 잘못했다고 생각하기 때문에 자주 사용합니다)

이 코드는 클래스의 속성을 bash하는 방법. 파이썬은 그렇게하는 것을 멈추지 않을 것입니다. 그러나 그와 같은 코드를 작성하는 좋은 이유를 찾기가 어려울 것입니다.

관련 문제