codingcogs' logo

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