مخفی سازی داده یا Data hiding

  • مدرس: علی بیگدلی
  • تاریخ انتشار: 1402/05/03
  • تعداد بازدید: 151

بخشی کلیدی از برنامه نویسی شی گرا، کپسول سازی است که شامل بسته بندی متغیرها و توابع مربوطه به یک واحد آسان برای استفاده - یک نمونه از یک کلاس است. مفهوم مربوط به پنهان سازی اطلاعات است، که بیان می کند که جزئیات پیاده سازی یک کلاس باید پنهان شود و یک رابط استاندارد تمیز برای کسانی که می خواهند از کلاس استفاده کنند، ارائه می شود. در زبان های برنامه نویسی دیگر، این معمولا با روش ها و ویژگی های خصوصی انجام می شود که دسترسی خارجی به متدها و ویژگی های خاصی در یک کلاس را مسدود می کند. فلسفه پایتون کمی متفاوت است. اغلب اظهار می شود که "ما همه افراد بزرگسال را در اینجا" می پذیریم، به این معنی که شما نباید محدودیت های خودسرانه ای را برای دسترسی به قسمت های یک کلاس قرار دهید. بدین ترتیب هیچ راهی برای اجرای یک روش وجود ندارد و خصوصیات آن به شدت خصوصی است. نکته:با این حال، راه هایی برای جلوگیری از دسترسی مردم به بخش های یک کلاس وجود دارد، از قبیل نشان دادن اینکه این یک جزئیات اجرایی است و باید در معرض خطر خود استفاده شود. در ابتدا روش ها و ویژگی های خصوصی به طور یکنواخت برجسته هستند. این نشان می دهد که آنها خصوصی هستند و نباید توسط کد خارجی استفاده شوند. با این حال، اغلب تنها یک کنوانسیون است، و کد خارجی را از دسترسی به آنها متوقف نمی کند. تنها اثر واقعی آن این است که از import_name import * متغیرهایی را وارد نمی کند که تنها با یک تاکسی شروع شوند. مثال:

class Queue:
  def __init__(self, contents):
    self._hiddenlist = list(contents)

  def push(self, value):
    self._hiddenlist.insert(0, value)
   
  def pop(self):
    return self._hiddenlist.pop(-1)

  def __repr__(self):
    return "Queue({})".format(self._hiddenlist)

queue = Queue([1, 2, 3])
print(queue)
queue.push(0)
print(queue)
queue.pop()
print(queue)
print(queue._hiddenlist)

خروجی:

>>>
Queue([1, 2, 3])
Queue([0, 1, 2, 3])
Queue([0, 1, 2])
[0, 1, 2]
>>>

نکته:در کد بالا، attribute _hiddenlist علامت گذاری به عنوان خصوصی است، اما همچنان در کد خارج می تواند مشاهده شود. روش __repr__ جادویی برای نمایش رشته نمونه مورد استفاده قرار می گیرد. روش ها و ویژگی های بسیار خصوصی در ابتدای نام آنها دارای دوبرابر هستند. این باعث می شود که اسامی آنها منهدم شود، به این معنی که آنها نمی توانند از خارج از کلاس دسترسی پیدا کنند. هدف از این این نیست که اطمینان حاصل شود که آنها خصوصی نگه داشته شوند، اما برای جلوگیری از اشکالات اگر زیر کلاس هایی وجود داشته باشند که دارای روش ها یا ویژگی هایی با نام های مشابه هستند. اما روش های نامگذاری شده، هنوز می توانند به صورت بیرونی به آن دسترسی پیدا کنند، اما با یک نام متفاوت. روش __ خصوصی سازی کلاس اسپم می تواند به صورت خارجی با شیوه _Spam__private method مورد استفاده قرار گیرد. مثال:

class Spam:
  __egg = 7
  def print_egg(self):
    print(self.__egg)

s = Spam()
s.print_egg()
print(s._Spam__egg)
print(s.__egg)

خروجی:

>>>
7
7
AttributeError: 'Spam' object has no attribute '__egg'
>>>

نکته:اساسا، پایتون از اعضای آن از طریق تغییر نام داخلی به نام نام کلاس محافظت می کند.