Funciones incorporadas de Python frente a funciones mágicas y reemplazo [duplicado]

Posible duplicado:
Interceptar la búsqueda del operador en metaclase
¿Cómo puedo interceptar llamadas a los métodos "mágicos" de python en las nuevas clases de estilo?

Considere el siguiente código:

class ClassA(object):
    def __getattribute__(self, item):
        print 'custom__getattribute__ - ' + item
        return ''
    def __str__(self):
        print 'custom__str__'
        return ''

a=ClassA()
print 'a.__str__: ',
a.__str__

print 'str(a): ',
str(a)

La salida me sorprendió:

a.__str__:  custom__getattribute__ - __str__
str(a):  custom__str__
No esstr(a) Se supone que debe ser asignado al método mágicoa.__str__()?Si quito la costumbreClassA.__str__(), entoncesClassA.__getattribute__() Todavía no capta la llamada. ¿Cómo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta