Dekorator - jak działa?

Dekorator - jak działa?
SP
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 5 lat
  • Postów:36
0

Ogarniam sobie podstawy dekoratorów i w przykładzie w poradniku jest cos takiego:

Kopiuj
def decorator_fun(original_fun):
   def wrapper_fun():
      print("To sie wykona przed original")
      return original_fun()
   return wrapper_fun

@decorator_fun
def display():
   print("funkcja original")

display()

i tak... z tego co rozumiem to za pomocą dekoratora możemy zmienić działanie funkcji bez jej bezpośredniej edycji,tak? Jednak nie rozumiem po co w tym przykładzie wrapper_fun()? Tzn czemu nie jest tak:

Kopiuj
def decorator_fun(original_fun):
   print("To sie wykona przed original")
   return original_fun()

@decorator_fun
def display():
   print("funkcja original")

display()

Dzieki za każdą odp.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około godziny
  • Postów:4927
1

To co Napisałęś w drugim listingu się nie kompiluje, wyświetla napisy, ale funkcja display nie istnieje (Zastąpiłes ją dekoratorem). W pierwszym, właśnie, ją "Dekorujesz".


SP
a dlaczego tak się dzieje, tzn zapis @decorator_fun (przed display() ) jest tożsamy z display = decorator_fun(display) ? to dlaczego ww kod sie nie kompiluje? TypeError: 'NoneType' object is not callable<br /> ale nie rozumiem czemu?
lion137
W pierwszym przypadku dekorator zwraca oryginalną funkcję, tylo udekorowaną; Możesz sprawdzic, że sa to dwa różne obiekty. A w drugim, nie ma funkcji display została zastąpiona dekoratorem. tak to po prostu działa. Sprawdź w obu przypadkach: print(display), print(decorator_fun).
MA
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 lata
  • Postów:337
1
Kopiuj
@decorator_fun
def display():
   print("funkcja original")

Funkcja jest obiektem w Pythonie.
Funkcja display jako obiekt, zostanie zastąpiona tym co zwróci decorator_fun.
Możesz powyższy przykład zastąpić odpowiednim zapisem, który jest równoznaczny czyli:

Kopiuj
def decorator(...):
     ....

def display():
     ....

display = decorator(display)

W momencie dekoracji interpreter zastąpi funkcję display, na to, co zostało zwrócone przez decorator.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.