Estoy tratando de interceptar las llamadas a los métodos mágicos de doble subrayado de Python en las nuevas clases de estilo. Este es un ejemplo trivial, pero el show de la intención:¿Cómo puedo interceptar llamadas a los métodos "mágicos" de Python en nuevas clases de estilo?
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
Si utilizo objeto proxy que alrededor de la lista consigo el comportamiento esperado de los métodos no-mágicas, pero mi función de contenedor nunca es llamado por métodos mágicos.
>>> 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
Si no heredar de objeto (primera línea class ShowMeList:
) todo funciona como se espera:
>>> 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
¿Cómo lograr esto interceptación con nuevas clases de estilo?
Lo que en realidad tratando de hacer mediante la interceptación de los métodos doble subrayado? ¿O es solo por curiosidad? – thesamet
Siempre guardo una lista de todos los métodos mágicos aquí: https://github.com/niccokunzmann/wwp/blob/6df6d7f60893a23dc84a32ba244b31120b1241a9/magicMethods.py (generado, por lo que funciona para python 2 y 3) – User
En realidad, parece que lo que quieres hacer es interceptar llamadas a los métodos mágicos de _instancias_ de una nueva clase de estilo, sin embargo, sigue siendo una buena pregunta en mi humilde opinión. – martineau