2016-06-21 10 views
0

개인 및 클래스의 일부 기능을 원숭이 패치하고 싶지만 패치 기능을 호출하고 싶습니다.원숭이 패치 python 2의 private 인스턴스 함수 old 함수 호출

예 :

class SomeClass: 
    def __some_function(self, foo): 
     return do_something() 

지금 내가 데코레이터로이 덮어 쓰기를 시도했지만 액세스 할 수없는 때문에 내가 이전 함수를 호출하는 문제가 있었다

def new_function(self, foo) 
    if foo == 'bar': 
     return True 
    return super(self).__some_function(foo) 

SomeClass.__some_function = new_function 

뭔가를 쓰고 싶어 . 또한 모의 라이브러리를 확인했지만 매개 변수를 사용하여 이전 함수를 호출하는 방법을 이해하지 못했습니다.


데코레이터 내가 시도 :이 오류가

def patch_something(method): 
    def new_function(self, foo): 
     if foo == 'bar': 
      return True 
     return method(self, foo) 
    return new_function 

SomeClass.__some_function = patch_something(SomeClass.__some_function) 

것은 (클래스가 다른 파일에 -이 문제인가?). 이중 밑줄 __

AttributeError: type object 'SomeClass' has no attribute '__some_function' 
+0

작동하지 않는 코드를 표시 할 수 있습니까? 덮어 쓴 메서드를 호출하려면 어딘가에 저장해야합니다. – syntonym

+1

'__'이 (가)있는 속성은 이름이 변경되어 있습니다 (예 : https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references). 'SomeClass._someclass__some_function'에 의해 접근 할 수 있어야합니다. – syntonym

+0

도움을 주셔서 감사합니다, 그것은 작동합니다 : D 조 : D 조. 이것은 원하는 답변입니다 (하지만 'SomeClass._SomeClass__some_function'이어야합니다). – ChristophLSA

답변

2

속성은 이름 난도질하고 the documentation에 설명 된대로 변환 된 이름에 액세스 할 필요가 :

즉 클래스 private 멤버에 대한 올바른 사용의 경우는 (가 있기 때문에 이름의 충돌이 서브 클래스에 의해 정의 된 것을 피하기 위해), 이름 변환 (name mangling)과 같은 메커니즘에 대한 지원은 제한적이다. __spam 형식의 식별자 (적어도 두 개의 밑줄이 밑줄)는 _classname__spam으로 텍스트로 대체됩니다. classname은 밑줄이 벗겨진 앞뒤 문자가있는 현재 클래스 이름입니다. 이 mangling은 클래스의 정의 내에서 발생하는 한 식별자의 통어론 적 위치에 상관없이 이루어진다.