Python/private variables

من موسوعة حسوب
< Python
مراجعة 12:25، 17 مارس 2018 بواسطة Mohammed Taher (نقاش | مساهمات) (أنشأ الصفحة ب'متغيرات الأصناف الخاصة (Private) والتي لا يمكن الوصول إليها من خارج الكائن غير موجودة في بايثون....')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

متغيرات الأصناف الخاصة (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 في توثيق بايثون الرسمي.