معنی underscore تکی و دوتایی استفاده شده در نام اشیا در پایتون چیست؟
در پایتون، وجود underscore تکی ( _
) و دوتایی ( __
) قبل از نام اشیا، نشاندهنده مقاصد متفاوتی است که عموماً به مفاهیم دسترسی و قابلیت مشاهده مربوط میشود.
underscore تکی (_var_name)
وجود underscore تکی در نام یک متغیر یا تابع به برنامهنویسها نشان میدهد که این متغیر یا تابع بهطور داخلی در کلاس یا ماژول مورد استفاده قرار میگیرد و احتمالا نباید بهطور مستقیم توسط کاربر نهایی استفاده شود. این موضوع در حقیقتن نوعی قرارداد است و پیادهسازی دسترسی را در سطح زبان اعمال نمیکند. به طور خاص:
- اگر ماژول
foobar
وجود داشته باشد و در آن تعریف نشود که__all__
چیست، نامهای با underscore تکی هنگام استفاده از دستورfrom foobar import *
از ماژول ایمپویت نمیشوند. - همچنین، نامهای با underscore تکی میتوانند بهعنوان متغیرهای «محافظتشده» نیز عمل کنند، بهخصوص زمانی که یک متد در کلاس پایه قرار دارد، که از ارثبرداری در کلاسهای فرزند حذف میشود و تنها برای قابلدسترس بودن درون کلاس طراحی شدهاند.
underscore دوتایی (__var_name)
وقتی دو underscore قبل از نام یک متغیر یا تابع قرار میگیرد، این عمل باعث "name mangling" میشود. به این معنی که نام متغیر به صورت خودکار بهصورت _classname__var_name
تغییر میکند، که classname
نام فعلی کلاس است. این کار بهطور عمده برای جلوگیری از همنامی با متغیرهای مشابه در کلاسهای فرزند انجام میشود و اقداماتی نظیر ایجاد متغیرهای خصوصی کلاس را آسانتر میکند. با این حال، احتمال دسترسی به این متغیرها همچنان وجود دارد و هیچ روشی برای جلوگیری کامل از آن وجود ندارد.
مثال
class MyClass():
def __init__(self):
self.__superprivate = "Hello"
self._semiprivate = ", world!"
mc = MyClass()
print(mc.__superprivate) # خطا: این متغیر قابل دسترسی نیست
print(mc._semiprivate) # خروجی: ، world!
print(mc.__dict__) # خروجی: {'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}