class Circle:
def __init__(self, radius):
self.radius = radius # از setter میگذرد
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value < 0:
raise ValueError("شعاع منفی ناممکن است.")
self._radius = value
@property
def area(self):
return 3.14159 * self._radius ** 2
بیرون همیشه c.radius میبیند؛ ولی امروز اعتبارسنجی و فردا شاید لاگ اضافه شود بدون اینکه هیچ مصرفکنندهای عوض شود. دام: property باید سریع و بدون غافلگیری باشد — اگر محاسبه سنگین یا اثر جانبی دارد، اسمش را متد بگذار (compute_area()) تا خواننده انتظارِ هزینه را داشته باشد.
اشتباه رایج
property برای مخفیکردن کندیِ محاسبه از کاربر است.
تصحیح
دقیقاً برعکس: خوانندهٔ property انتظار دسترسیِ ارزان دارد. هزینهٔ پنهان، خیانت به قرارداد است.