Надеюсь, что кто-то, кто знаком с процедурами компиляции и выполнения Python, может пролить свет на мой вопрос, связанный с тем, как Python компилирует декоратор.Функция декоратора Python, вызванная во время компиляции
В моем примере кода я включил тестовый отчет печати в декодер «writeit» непосредственно перед закрытием logtofile. Если вы запустили весь код, который я предоставил, для каждого декоратора @writeit, определенного в классе Customer, вызывается запрос печати «test» в printit, прежде чем writeit будет когда-либо использоваться.
Почему во время компиляции вызывается logtofile? Может ли кто-нибудь объяснить это поведение?
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()
Это не во время компиляции, это во время выполнения. Но для запуска ваших инструкций 'def' в определении класса требуется запуск декораторов, которые их украшают. – geoffspear