چی به چی دسترسی داره (‌Access Modifier)

سطوح دسترسی در برنامه نویسی یکی از اصول مهم و پایه ای به حساب می آید و دانستن آن برای نوشتن یک برنامه الزامی است. در واقع کنترل دسترسی (Access Modifire) مشخص می کند چگونه به یکclass، method، variable و یا property در برنامه دسترسی خواهیم داشت.انواع دسترسی یک عنصر به صورت زیر است:عمومی (public): این سطح دسترسی کمترین محدودیت را در انواع خود دارد، عناصری که به صورت public تعریف می شوند در تمامی کلاس ها به آن ها دسترسی خواهیم داشت.محافظت شده (protected):فقط اعضای کلاس و کلاس هایی که از آن کلاس ارث بری می کنند به عناصر private دسترسی دارند. خصوصی (private):فقط اعضای کلاس جاری به عناصر private دسترسی دارند. کلاس ها به طور پیش فرض private هستند.‌درونی (internal):عناصر فقط در پروژه فعلی در دستر هستند (فقط در زبان #C). درونی محافظت شده (protected internal):مانند دسترسی internal است با این تفاوت که این عناصر در پروژه های دیگر نیز در دسترس هستند (فقط در زبان #C).موارد گفته شده در اکثر زبان های برنامه نویسی در مشابه است ولی در مورد زبان پایتون اندکی متفاوت است. در ادامه به بررسی و پیاده سازی Access Modifier در پایتون می پردازیم.در پایتون تنها انواع public‌، private و protected را در اختیار داریم که بدون استفاده از کلمه کلیدی و به طور ضمنی پیاده سازی می شوند.به عنوان مثال کلاس زیر را در نظر بگیرید:class Client: def __init__(self, name, age): self.name = name self.age = ageدر تابع سارنده کلاس دو متغیر age و name تعریف شده است که به صورت پیش فرض public هستند و در همه کلاس های پروژه در دسترس هستند. حال از کلاس Client نمونه ایجاد می کنیم و مشاهده می کنیم که به عناصر عمومی دسترسی داریم:>>> client = Client(&quotmehdi&quot,28) >>> client.name mehdi >>> client.age 28در زبان پایتون عنصر protected به معنای گفته شده عملا وجود ندارد و به طور ضمنی برنامه نویس با قرار دادن یک ـ (underline) قبل از نام عناصر مشخص می کند که عنصر به صورت protected تعریف شده است. class Client: def __init__(self, name, age): self._name = name self._age = age حال از کلاس نمونه می سازیم و همانطور که مشاهده می کنید همچنان به عناصر protected دسترسی داریم:>>> client = Client(&quotmehdi&quot, 28) >>> client._age 28 >>> client._age = 20 >>> client._age 20راه حل دیگر استفاده از property به منظور protected کردن (کپسوله کردن) اعضای کلاس است. اما این روش نیز منجر به عدم دسترسی به اعضای protected نمی شود. بنابراین می توان نتیجه گرفت که در پایتون، برنامه نویس مسئول عدم استفاده از فیلدهای protected است.class Client: def __init__(self, name): self._name = name @property def name(self): return self._name @name.setter def name(new_name): self._name = new_name>>> client = Client('name') >>> client.neme 'name' >>> client._name 'name'همانطور که متوجه شدیم، پایتون مکانیزمی جهت جلوگیری از instance variable ها و یا instance method ها ندارد و تنها به ارائه convention برای کنترل این اعضا بسنده می کند.برای تعریف عناصر private در پایتون از __ (۲ تا underline) قبل از نام عنصر استفاده می کنیم. class Client: def __init__(self, name, age): self.__name = name self.__age = age با ایجاد نمونه از کلاس Client و فراخوانی مقادیر private خواهیم داشت:>>> client = Client(&quotmehdi&quot, 28) >>> client.__age AttributeError: 'client' object has no attribute '__age'خطای فوق نشان می دهد نمونه ساخته شده دسترسی به مقادیر private را نخواهد داشت.اما هنوز امکان دسترسی به متغیر های private وجود دارد. با در نظر داشتن مثال فوق به صورت زیر به age__ و ‌name__ دسترسی خواهیم داشت:>>> client._Client__name mehdi