کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش متغیر های خصوصی (Private) در پایتون


آموزش متغیر های خصوصی (Private) در برنامه نویسی پایتون


متغیر های نمونه خصوصی که از جایی غیر از درون یک شی قابل دسترس نباشند، در پایتون وجود ندارد. اگر چه قراردادی وجود دارد که توسط اکثر کدهای پایتون رعایت می شود: نامی که بعد از خط زیرین بیاید، مانند (_spam) باید به عنوان یک بخش غیر عمومی از API در نظر گرفته شود( چه یک تابع باشد یا یک متد یا یک عضو داده). این باید به عنوان جزییات پیاده سازی در نظر گرفته شود و بدون اطلاع قبلی تغییر کند.

از آنجایی که یک کاربرد معتبر برای اعضای خصوصی کلاس وجود دارد( برای جلوگیری از درگیری نام ها با نام های تعریف شده توسط زیر کلاس ها)، یک پشتیبانی محدود به نام ‘تغییرات نام’ (name mangling) برای چنین مکانیزمی وجود دارد.

هر شناسه ای در قالب __spam (حد اقل دو خط زیرین در قبل، حداکثر یک خط زیرین در ادامه) از لحاظ نگارشی با _classname__spam جایگزین می شود، که classname نام کلاس جاری است که خط زیرین قبل از آن حذف شده است. این تغییرات تا زمانی که درون تعریف کلاس رخ دهند ، بدون توجه به مکان نوشته شدن شناسه انجام می شوند.

تغییرات نام برای امکان پذیر کردن تغییر متدها توسط زیر کلاس ها، بدون شکستن فراخوانی های متد درون-کلاسی مفید هستند. برای مثال:

    def __init__(self, iterable):
        self.items_list = []
        self.__update(iterable)

    def update(self, iterable):
        for item in iterable:
            self.items_list.append(item)

    __update = update   # private copy of original update() method

class MappingSubclass(Mapping):

    def update(self, keys, values):
        # provides new signature for update()
        # but does not break __init__()
        for item in zip(keys, values):
            self.items_list.append(item)

مثال بالا حتی اگر MappingSubclass مجبور به معرفی شناسه __update باشد نیز کار می کند، زیرا به ترتیب با _Mapping__update در کلاس Mapping ، و _MappingSubclass__update در کلاس MappingSubclass جایگزین شده است.

توجه داشته باشید، قوانین تغییرات اکثرا برای جلوگیری از تصادفات طراحی شده اند اما همچنان احتمال دسترسی یا تغییر متغیری که خصوصی فرض می شود وجود دارد. در بعضی شرایط خاص مانند اشکال زدایی، این امر می تواند حتی مفید باشد.

توجه کنید، کد پاس داده شده به exec() یا eval() ، نام کلاس صدا زننده کلاس را به عنوان کلاس جاری در نظر نمی گیرد. این مشابه اثر عبارت global است، اثری که به همین ترتیب به کدی که با هم کامپایل (byte-compiled) شده اند محدود می شود. همین محدودیت روی getattr() ، setattr() و delattr() ، و نیز در زمان ارجاع مستقیم به __dict__ اعمال می شود.

1403/05/29 4105 600
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...