Как я могу перехватить вызовы «волшебных» методов Python в классах нового стиля?

Я пытаюсь перехватить вызовы магических методов двойного подчеркивания Python в классах нового стиля. Это тривиальный пример, но он показывает намерение:

class ShowMeList(object):
    def __init__(self, it):
        self._data = list(it)

    def __getattr__(self, name):
        attr = object.__getattribute__(self._data, name)
        if callable(attr):
            def wrapper(*a, **kw):
                print "before the call"
                result = attr(*a, **kw)
                print "after the call"
                return result
            return wrapper
        return attr

Если я использую этот прокси-объект вокруг списка, я получаю ожидаемое поведение для немагических методов, но моя функция-оболочка никогда не вызывается для магических методов.

>>> l = ShowMeList(range(8))

>>> l #call to __repr__
<__main__.ShowMeList object at 0x9640eac>

>>> l.append(9)
before the call
after the call

>> len(l._data)
9

Если я не наследую от объекта (первая строка class ShowMeList: ), все работает, как ожидалось:

>>> l = ShowMeList(range(8))

>>> l #call to __repr__
before the call
after the call
[0, 1, 2, 3, 4, 5, 6, 7]

>>> l.append(9)
before the call
after the call

>> len(l._data)
9

Как мне выполнить этот перехват с новыми классами стилей?

32
задан Finn 29 January 2012 в 23:14
поделиться