Skip to content

Instantly share code, notes, and snippets.

@eliasalbuquerque
Last active December 8, 2023 17:37
Show Gist options
  • Save eliasalbuquerque/0fb9177f6d193af1e4bb1eda0fd2b9dc to your computer and use it in GitHub Desktop.
Save eliasalbuquerque/0fb9177f6d193af1e4bb1eda0fd2b9dc to your computer and use it in GitHub Desktop.
Curso Dev Aprender | Jhonatan de Souza

Entendendo o Decorators

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)}")
  1. Você chama a função pai() com o argumento 2.
  2. Dentro da função pai(), o número 2 corresponde à função filho_2(), então filho_2() é retornado.
  3. A referência para a função filho_2() é armazenada na variável resultado.
  4. Quando você chama resultado(), você está realmente chamando filho_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().

Referência

  1. pythonbasics.org - Python Decorators Introduction - acessado em 08/12/2023.
  2. realpython.com - Contrasting Pass by Reference and Pass by Value - acessado em 08/12/2023.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment