Función decoradora de Python llamada en tiempo de compilación

Espero que alguien familiarizado con los procedimientos de compilación / ejecución de Python pueda aclarar mi pregunta sobre cómo Python compila las funciones de decorador.

Dentro de mi código de muestra, he incluido una declaración de impresión de prueba en el decorador "writeit" justo antes de que se defina el cierre de logtofile. Si ejecuta el código completo que he proporcionado, se llama la declaración de impresión de "prueba" en writeit para cada decorador @writeit definido en la clase de Cliente, antes de que se use writeit.

¿Por qué se llama logtofile en tiempo de compilación? ¿Podría alguien explicar este comportamiento?

def writeit(func): 
    print('testing')

    def logtofile(customer, *arg, **kwargs):
        print('logtofile')
        result = func(customer, *arg, **kwargs)        
        with open('dictlog.txt','w') as myfile:
            myfile.write(func.__name__)
        return result

    return logtofile

class Customer(object):
    def __init__(self,firstname,lastname,address,city,state,zipcode):        
        self._custinfo = dict(firstname=firstname,lastname=lastname,address=address,city=city,state=state,zipcode=zipcode)        

    @writeit
    def setFirstName(self,firstname):
        print('setFirstName')
        self._custinfo['firstname']=firstname

    @writeit
    def setLastName(self,lastname):
        print('setLastName')
        self._custinfo['lastname']=lastname

    @writeit
    def setAddress(self,address):
        print('setAddress')
        self._custinfo['address']=address

def main():
    cust1 = Customer('Joe','Shmoe','123 Washington','Washington DC','DC','12345')
    cust1.setFirstName('Joseph')
    cust1.setLastName('Shmoestein')

if(__name__ == '__main__'): main()

Respuestas a la pregunta(2)

Su respuesta a la pregunta