پنهانکردن جزئیات داخلی پشت یک قرارداد عمومیِ پایدار تا بیرون به پیادهسازی وابسته نشود.
پایتون عضو خصوصیِ اجباری مثل جاوا ندارد و این تصمیمِ آگاهانهٔ زبان است، نه کمبود:
_name: قرارداد «داخلی» — بخوان ولی دست نزن.__name: فعالسازی name mangling (تغییرنام به_Class__name) برای جلوگیری از تداخل در وراثت، نه امنیت.property: خواندنِ کنترلشده بدون شکستن قرارداد.
class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def celsius(self):
return self._celsius
@celsius.setter
def celsius(self, value):
if value < -273.15:
raise ValueError("زیر صفر مطلق ناممکن است.")
self._celsius = value
بیرون همیشه t.celsius میبیند؛ امروز ویژگی ساده، فردا اعتبارسنجی — و هیچ کدی بیرون عوض نمیشود. این تمامِ جادوست.
اشتباه رایج
چون به _balance میشود دسترسی داشت، پس کپسولهسازی در پایتون بیمعناست.
تصحیح
کپسولهسازی قرارداد اجتماعی و طراحی است نه قفل حافظه. در همهٔ زبانها برنامهنویسِ مصمم میتواند به جزئیات برسد؛ هنر این است که کدِ سالم نیازی به این کار نداشته باشد.