파이썬 (=> 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__
, 그리고 아마도 다른 사람을 할당
당신이 이것을하고 싶다는 진정한 본보기를 제공 할 수 있습니까? 나는 틀린 이유로 상속을 우회하고 있다는 느낌이 들립니다. 문제를 골라 내면 도움이 될 것입니다. – synthesizerpatel
그리고 너의 porpuses은 ...? – Apalala