الفرق بين المراجعتين ل"Python/private variables"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (نقل عبد اللطيف ايمش صفحة Python/private-variables إلى Python/private variables)
 
(مراجعة متوسطة واحدة بواسطة نفس المستخدم غير معروضة)
سطر 4: سطر 4:
 
هناك حالة واحدة تستدعي استخدام عناصر الأصناف الخاصة وهي تجنب حدوث تضارب بين الأسماء الموجودة في الصنف والأسماء المعرّفة في الأصناف الفرعية، ونظرًا لذلك تقدم اللغة دعمًا محدودًا لمثل هذه الحالة، وتدعى بتشويه الأسماء name mangling. يجري استبدال أي معرّف يحمل صيغة <code>‎__spam</code> (أي ما لا يقل عن شرطتين سفليتين سابقتين، وما لا يزيد عن شرطة سفلية لاحقة) بالصيغة <code>‎_classname__spam</code>، حيث <code>classname</code> هو اسم الصنف الحالي مع حذف الشرطات السفلية الأمامية.
 
هناك حالة واحدة تستدعي استخدام عناصر الأصناف الخاصة وهي تجنب حدوث تضارب بين الأسماء الموجودة في الصنف والأسماء المعرّفة في الأصناف الفرعية، ونظرًا لذلك تقدم اللغة دعمًا محدودًا لمثل هذه الحالة، وتدعى بتشويه الأسماء name mangling. يجري استبدال أي معرّف يحمل صيغة <code>‎__spam</code> (أي ما لا يقل عن شرطتين سفليتين سابقتين، وما لا يزيد عن شرطة سفلية لاحقة) بالصيغة <code>‎_classname__spam</code>، حيث <code>classname</code> هو اسم الصنف الحالي مع حذف الشرطات السفلية الأمامية.
  
تجري عملية التشويه هذه دون الاعتناء بموقع المعرّف اللغوي، ما دام موجودًا داخل كتلة [[Python/class-definition|تعريف الصنف]]، ومن فوائدها أنّها تسمح للأصناف الفرعية بإعادة تعريف التوابع دون إفساد عمليات استدعاء التوابع داخل الصنف.
+
تجري عملية التشويه هذه دون الاعتناء بموقع المعرّف اللغوي، ما دام موجودًا داخل كتلة [[Python/class_definition|تعريف الصنف]]، ومن فوائدها أنّها تسمح للأصناف الفرعية بإعادة تعريف التوابع دون إفساد عمليات استدعاء التوابع داخل الصنف.
  
 
في المثال التالي تمثّل <code>‎__update</code> نسخة خاصّة من التابع الأصلي <code>update()</code>‎، وهكذا تقدم عملية إعادة تعريف الدالة <code>update()‎</code> في الصنف الفرعي <code>MappingSubclass</code> توقيعًا جديدًا لهذه الدالة دون المساس بالتابع <code>‎__init__()</code>‎:<syntaxhighlight lang="python3">
 
في المثال التالي تمثّل <code>‎__update</code> نسخة خاصّة من التابع الأصلي <code>update()</code>‎، وهكذا تقدم عملية إعادة تعريف الدالة <code>update()‎</code> في الصنف الفرعي <code>MappingSubclass</code> توقيعًا جديدًا لهذه الدالة دون المساس بالتابع <code>‎__init__()</code>‎:<syntaxhighlight lang="python3">

المراجعة الحالية بتاريخ 12:51، 22 مايو 2018

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