Python-Decorator-Funktion, die beim Kompilieren aufgerufen wird

Ich hoffe, dass jemand, der mit Pythons Kompilierungs- / Laufzeitprozeduren vertraut ist, etwas Licht auf meine Frage werfen kann, wie Python die Decorator-Funktionen kompiliert.

In meinem Beispielcode habe ich eine Testdruckanweisung in den "Writeit" -Dekorator eingefügt, kurz bevor der Logdatei-Abschluss definiert wird. Wenn Sie den gesamten von mir bereitgestellten Code ausführen, wird die Druckanweisung "testing" in writeit für jeden in der Customer-Klasse definierten @ writeit-Dekorator aufgerufen, bevor writeit jemals verwendet wird.

Warum wird die Protokolldatei zur Kompilierungszeit aufgerufen? Könnte jemand bitte dieses Verhalten erklären?

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()

Antworten auf die Frage(2)

Ihre Antwort auf die Frage