2011-01-19 4 views
2

파이썬 (=> 2.6)에서 계승 된 메소드를 체계적으로 오버라이드하는 '간단한'솔루션을 찾고 있습니다. 이건 내 (현재) 목적을 위해 충분히 잘 작동하는 것 같다체계적이고 투명하게 파이썬 메소드를 오버라이드하는 방법

def override(cls, o): 
"""Override class method(s).""" 
for t in o: # possible problem; nondeterministic order 
    for name in o[t]: 
     mtbo= getattr(cls, name).im_func 
     om= t(mtbo) 
     om.__name__= mtbo.__name__ 
     om.__doc__= mtbo.__doc__ 
     # What additional magic is needed here to act as 'genuine' method of super class? 
     setattr(cls, name, om) 

if __name__== '__main__': 
    class B(object): 
     def f1(self, val): 
      """Doc of B.f1"""; print '1: ', val 
     def f2(self, val): 
      """Doc of B.f2"""; print '2: ', val 
    class A(B): 
     pass 

    def t(f, msg): 
     def g(self, *args, **kwargs): 
      print msg, ' entering'; result= f(self, *args, **kwargs) 
     return g 
    t1= lambda f: t(f, 't1'); t2= lambda f: t(f, 't2') 
    override(A, {t1: ['f1', 'f2'], t2: ['f2']}) 

    def tst(c): 
     c.f1(1); print c.f1.__name__, c.f1.__doc__ 
     c.f2(2); print c.f2.__name__, c.f2.__doc__ 
    tst(B()), tst(A()) 

: 내 이전 질문 here을 바탕으로, 나는 해결책을 마련하겠습니다. 그러나 가능한 한 투명하게 재정의 할 수 있기를 바란다. 따라서 수퍼 클래스 메서드 이름과 doc을 보존 할 것이다. 이제 나의 구체적인 질문은 : 나는 다른 것을 보존해야 하는가? 이것에 대한 당신의 해결책은 무엇입니까?

업데이트 : 지금이 질문을 생각은 훨씬 더 넓은 파급 효과를 가지고 : 나는 (원래) 방법, 또는 기능을 합리적인 충분히 파이썬 방법을 장식하는 방법을 질문해야 quess. 대신 수동으로 __name__, __doc__, 그리고 아마도 다른 사람을 할당

+3

당신이 이것을하고 싶다는 진정한 본보기를 제공 할 수 있습니까? 나는 틀린 이유로 상속을 우회하고 있다는 느낌이 들립니다. 문제를 골라 내면 도움이 될 것입니다. – synthesizerpatel

+1

그리고 너의 porpuses은 ...? – Apalala

답변

1

, 당신은 가능성이 단지 관련 속성을 복사하기 위해 functools.update_wrapper를 호출 할 수 있습니다.

+0

마침내 누군가 내 의도를 파악합니다. 심지어 많은 문서를 열람했지만 실제로는 처음으로 'update_wrapper'가 발생했습니다. 나는 그것을 더 자세하게 연구 할 것이다. 나는 이것이 단지 '수업 방법을 과장하는 것'보다 더 일반적인 문제라는 것을 알게 될 것이다. 감사 – eat

관련 문제