Я пытаюсь перехватить вызовы магических методов двойного подчеркивания 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
Как мне выполнить этот перехват с новыми классами стилей?