property decorator
دکوراتور property شبیه static method و class method استفاده میشود. با استفاده از property decorator میتوانیم از یک method مثل یک attribute در object استفاده کنیم و لازم نیست به شکل function با () آن را کال کنیم.
برای درک property decorator ابتدا به کد زیر توجه کنید:
class Temperature():
def __init__(self, celsius, fahrenheit):
self.celsius = celsius
self.fahrenheit = fahrenheit
freezing = Temperature(0, 32)
freezing.fahrenheit # 32 در مثال بالا به اشتباه دمای سلسیوس و فارنتهایت را در کنار هم به شکل پیشمحاسبه (pre-computed) ذخیره میکنیم. این دو واحد دمایی اما به یکدیگر قابل تبدیل هستند:
class Temperature():
def __init__(self, celsius):
self.celsius = celsius
def fahrenheit(self):
return self.celsius * 9 / 5 + 32
freezing = Temperature(0)
print(freezing.fahrenheit()) # 32.0
freezing.celsius = -10
print(freezing.fahrenheit()) # 14.0 میبینید که دیگر لازم نیست با هربار تغییر دمای celsius دمای fahrenheit را نیز محاسبه کنیم. اگر بخواهیم رفتار fahrenheit instance method شبیه attribute باشد و برای فرخوانی (Call) کردن آن نیازی به () نداشته باشیم، میتوانیم از fahrenheit به شکل property استفاده کنیم:
class Temperature():
def __init__(self, celsius):
self.celsius = celsius
@property
def fahrenheit(self):
return self.celsius * 9 / 5 + 32
freezing = Temperature(0)
print(freezing.fahrenheit) # 32.0
freezing.celsius = 100
print(freezing.fahrenheit) # 212.0