No código, a função pai()
retorna uma referência para as funções filho_1()
ou filho_2()
, dependendo do valor do argumento numero
. Quando você chama
pai(2)
, a função pai()
retorna uma referência para a função filho_2()
.
Essa referência é então armazenada na variável resultado
. Quando você chama
resultado()
, você está realmente chamando a função filho_2()
, por esse
motivo, tanto resultado
como filho_2
tem o mesmo ID.
Segue explicação passo a passo:
# retornar referencia de funcoes
def pai(numero):
def filho_1():
print('2. Sou filho 1')
print(f"ID objeto filho_1 : {id(filho_1)}") # ID comparacao com ID resultado()
def filho_2():
print('2. Sou filho 2')
print(f"ID objeto filho_2 : {id(filho_2)}") # ID comparacao com ID resultado()
if numero == 1:
return filho_1
if numero == 2:
return filho_2
resultado = pai(2)
resultado()
# ID comparacao com ID filho_1() e filho_2()
print(f"ID objeto resultado : {id(resultado)}")
- Você chama a função
pai()
com o argumento2
. - Dentro da função
pai()
, o número2
corresponde à funçãofilho_2()
, entãofilho_2()
é retornado. - A referência para a função
filho_2()
é armazenada na variável resultado. - Quando você chama
resultado()
, você está realmente chamandofilho_2()
, então "2. Sou filho 2" é impresso na tela.
PS C:\Users\elias\Workspace\python-devaprender> python mod4-decorators.py
2. Sou filho 2
ID objeto filho_2 : 2072911663552
ID objeto resultado : 2072911663552
PS C:\Users\elias\Workspace\python-devaprender>
Como vemos na saída do terminal, os ID's do filho
e resultado
são
identicos, sendo assim, são o mesmo objeto e por isso o valor contido
na função filho_2()
é carregado para resultado()
.
- pythonbasics.org - Python Decorators Introduction - acessado em 08/12/2023.
- realpython.com - Contrasting Pass by Reference and Pass by Value - acessado em 08/12/2023.