Как систематически и прозрачно переопределить методы Python - PullRequest
2 голосов
/ 19 января 2011

Я ищу «простое» решение для систематического переопределения некоторых унаследованных методов в Python (=> 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())

Это, кажется, работает достаточно хорошо для моих (текущих) целей. Однако я хотел бы иметь возможность переопределять как можно более прозрачно, поэтому я сохраню имена методов суперкласса и doc. Теперь мой конкретный вопрос: я должен сохранить что-нибудь еще? Какое у вас решение для этого?

Обновление: Я думаю, что теперь этот вопрос имеет гораздо более широкие последствия: я спрашиваю, я должен был (изначально) спросить, как украсить методы или функции достаточно разумным образом.

1 Ответ

2 голосов
/ 09 февраля 2011

Вместо того, чтобы вручную присваивать __name__, __doc__ и, возможно, другие, вы, вероятно, можете просто вызвать functools.update_wrapper, чтобы убедиться, что соответствующие атрибуты скопированы.

...