المتغيرات الخاصة في بايثون

من موسوعة حسوب
مراجعة 12:51، 22 مايو 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (نقل عبد اللطيف ايمش صفحة Python/private-variables إلى Python/private variables)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

لا تدعم بايثون متغيرات الأصناف الخاصة (Private) والتي لا يمكن الوصول إليها من خارج الكائن، ولكن يتفق معظم المبرمجين على أنّ الاسم المسبوق بشرطة سفلية (مثل: ‎_spam) يجب أن يُعامل كجزء غير عام من الواجهة البرمجية (سواء كان ذلك الجزء دالة أم تابعًا أم خاصية). 

هناك حالة واحدة تستدعي استخدام عناصر الأصناف الخاصة وهي تجنب حدوث تضارب بين الأسماء الموجودة في الصنف والأسماء المعرّفة في الأصناف الفرعية، ونظرًا لذلك تقدم اللغة دعمًا محدودًا لمثل هذه الحالة، وتدعى بتشويه الأسماء name mangling. يجري استبدال أي معرّف يحمل صيغة ‎__spam (أي ما لا يقل عن شرطتين سفليتين سابقتين، وما لا يزيد عن شرطة سفلية لاحقة) بالصيغة ‎_classname__spam، حيث classname هو اسم الصنف الحالي مع حذف الشرطات السفلية الأمامية.

تجري عملية التشويه هذه دون الاعتناء بموقع المعرّف اللغوي، ما دام موجودًا داخل كتلة تعريف الصنف، ومن فوائدها أنّها تسمح للأصناف الفرعية بإعادة تعريف التوابع دون إفساد عمليات استدعاء التوابع داخل الصنف.

في المثال التالي تمثّل ‎__update نسخة خاصّة من التابع الأصلي update()‎، وهكذا تقدم عملية إعادة تعريف الدالة update()‎ في الصنف الفرعي MappingSubclass توقيعًا جديدًا لهذه الدالة دون المساس بالتابع ‎__init__()‎:

class Mapping:
    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
class MappingSubclass(Mapping):
    def update(self, keys, values):
        for item in zip(keys, values):
            self.items_list.append(item)

لاحظ أنّ الهدف من قواعد تشويه الأسماء هو تجنب الأخطاء فقط، ولكن لا زال بالإمكان الوصول وإجراء التعديلات على المتغيرات التي تعدّ خاصّة، ويمكن لهذا الأمر أن يكون مفيدًا في عملية التنقيح مثلًا.

مصادر

  • صفحة Classes في توثيق بايثون الرسمي.