قبل از وارد شدن به مبحث دکوراتورها در پایتون، باید ابتدا درک کنید که یک تابع چگونه کار می‌کند. توابع گروهی از قطعه کدها می‌باشند که یک کار مشخص را انجام می‌دهند و به شما کمک می‌کنند تا برنامه‌ای که می‌نویسید به بخش‌های کوچک‌تر و ماژول‌ها تقسیم شود. بصورت خلاصه می‌توان نحوه‌ی کار توابع در پایتون را با شکل زیر نمایش داد:

دکوراتورها در پایتون

 

دوره رایگان آموزش جنگو

مثال دکوراتورها در پایتون

توابع یک مقدار را بر اساس آرگومان‌های ورودی برمی‌گردانند. در ادامه یک مثال ساده از نحوه‌ی کار تابع آورده شده است:

 

def sum(a, b):
	return a + b

sum(1 + 2)
----------------------
> 3

پایتون دارای یک ابزار قدرتمند و مفید به نام Decorator می‌باشد. دکوراتورها این امکان را به شما می‌دهند تا رفتار یک تابع یا کلاس را شخصی‌سازی کرده و عملکرد آن را تغییر دهید تا مطابق با منطق برنامه خود بتوانید آن را گسترش دهید.

برای درک دکوراتورها کافیست توابع را دستگاهی در نظر بگیریم که آرگومان‌های ورودی را به یک مقدار تبدیل می‌کند. در دکوراتورها، تابع مورد نظر خود را بعنوان یک آرگومان در توابعی که می‌خواهید گرفته، سپس در داخل تابع wrapper آن را فراخوانی می‌کنید.

این ویژگی به این دلیل است که در پایتون توابع first class objects هستند و می‌توان آن‌ها را مانند رشته، لیست، int، float و غیره، بعنوان آرگومان ورودی ارسال کرده و از آن‌ها استفاده کرد. به مثال زیر توجه کنید:

 

def hello_func(name):
	return f"Hello {name}"
def greet_func(name):
	return f"How are you, {name}?"
def greet_john(greeting)
	return greeting("John")
---------------------------------------------------------
greet_john(hello_func)
>>> Hello John
Greet_john(greet_func)
>>> How are you, John?

در این مثال دو تابع اول توابع یک نام را بعنوان آرگومان ورودی دریافت می‌کنند ولی تابع سوم یک تابع را بعنوان آرگومان ورودی برای خود انتظار دارد. این مثال به خوبی نشان می‌دهد که توابع در پایتون همانند اشیاء هستند. در ادامه مثالی از دکوراتورها آورده شده است:

 

def my_decorator(func):
	def wrapper():
		print("BEFORE")
		func()
		print("AFTER")
	return wrapper

def underline():
	print("---------------")
underline = my_decorator(underline)

----------------------------------------------
underline()
>>> 
BEFORE
---------------
AFTER

تابع underline به wrapper اشاره می‌کند و وقتی تابع my_decorator را فراخوانی می‌کنید، wrapper بعنوان یک تابع برگردانده می‌شود.

راستی! اگر به برنامه نویسی و تکنولوژی علاقمند هستید حتما پیج کدیتی در اینستاگرام رو فالو کنید، مرسی <3