دکوراتور property

دکوراتور property شبیه متد های استاتیک و کلاسی هست که تا الان باهاشون سروکار داشتیم. این دکوراتور به یک متد اجازه میده تا به عنوان یک اتریبیوت از یک آبجکت بهش دسترسی پیدا کنیم و دیگه مثل یک فانکشن از () برای کال کردنش استفاده نکنیم.

برای اینکه کاربرد این دکوراتور رو درک کنید، کلاس زیر رو در نظر بگیرید، که در مورد دما یه سری اطلاعات ذخیره میکنه:

class Temperature():
def __init__(self, celsius, fahrenheit):
self.celsius = celsius
self.fahrenheit = fahrenheit

حالا بیاید تا یک آبجکت Temprature جدید ایجاد کنیم و اتریبیوت fahrenheit رو بررسی کنیم:

freezing = Temperature(0, 32)
freezing.fahrenheit

خروجی کد بالا به صورت زیره:

32

حالا فرض کنید بخوایم فقط سلسیوس رو به عنوان اتریبیوت ذخیره کنیم و در صورت نیاز اون رو به فارنهایت تبدیل کنیم:

class Temperature():
def __init__(self, celsius):
self.celsius = celsius

def fahrenheit(self):
return self.celsius * 9 / 5 + 32

الان بهتر شد، چون اگه مقدار سلسیوس آپدیت شد دیگه نیازی نیست بریم دستی فارنهایت رو هم آپدیت کنیم:

my_temp = Temperature(0)
print(my_temp.fahrenheit())
my_temp.celsius = -10
print(my_temp.fahrenheit())

پس از اجرای کد بالا باید خروجی زیر رو بگیرید:

32.0
14.0

در کد بالا همونطور که میبینید باید متد fahrenheit رو با () کال کنیم، در صورتی که قبلا که به صورت اتریبیوت ذخیره شده بود و میخواستیم بهش دسترسی پیدا کنیم نیازی به () نداشتیم.

حالا در صورتی که یک سری از افراد از نسخه قبلی کدمون که فارنهایت رو به صورت اتریبیوت ذخیره میکرد استفاده کرده باشن و بهش عادت کرده باشن و ما بیایم اون رو تبدیل به یک متد کنیم، میتونه براشون مشکل ساز باشه. اونوقت تمام رفرنس های مربوط به fahrenheit باید یک () کنارشون قرار داده بشه و کد بقیه مشکل پیدا میکنه. بجاش میتونیم بیایم اون رو به یک ویژگی تبدیل کنیم، اینطوری میتونیم به اون به عنوان یک اتریبیوت دسترسی داشته باشیم، بدون در نظر گرفتن اینکه یک متد باشه. برای پیاده سازی این روش تنها کاری که باید بکنیم اینه که یک دکوراتور property قبل از تعریف متد قرار بدیم:

class Temperature():
def __init__(self, celsius):
self.celsius = celsius

@property
def fahrenheit(self):
return self.celsius * 9 / 5 + 32

حالا میتونیم به ویژگی fahrenheit به صورت زیر دسترسی پیدا کنیم:

freezing = Temperature(100)
freezing.fahrenheit

حالا باید خروجی زیر رو دریافت کنیم:

212.0