View Categories

9.6. المتغيرات الخاصة

2 دقيقة

جدول المحتويات

9.6. المتغيرات الخاصة #

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

نظرًا لوجود حالة استخدام صحيحة للأعضاء الخاصة بالفئة (وهي لتجنب تضارب الأسماء مع الأسماء المُعرّفة بواسطة الفئات الفرعية)، فإن الدعم لهذه الآلية، والتي تُسمى “تشويه الأسماء”، محدود. أي مُعرِّف من صيغة __spam (شرطتان سفليّتان على الأقل، وشرطة سفليّة واحدة على الأكثر) يُستبدل نصيًا بـ _classname__spam، حيث يُشير classname إلى اسم الفئة الحالي بعد إزالة الشرطات السفليّة. يتم هذا التشويه بغض النظر عن الموضع النحوي للمُعرِّف، طالما أنه موجود ضمن تعريف الفئة.

يُفيد تشويه الأسماء في السماح للفئات الفرعية بتجاوز الدوال دون تعطيل استدعاءات الدوال داخل الفئة. على سبيل المثال:

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   # 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() لا يعتبر اسم فئة الفئة المُستدعية هو الفئة الحالية؛ وهذا يُشبه تأثير العبارة العامة، التي يقتصر تأثيرها أيضًا على الكود المُجمَّع بايتيًا. ينطبق نفس القيد على getattr() و setattr() و delattr()، وكذلك عند الإشارة إلى __dict__ مباشرةً.

error: Content is protected !!
Scroll to Top