الفرق بين المراجعتين لصفحة: «Python/private variables»
أنشأ الصفحة ب'متغيرات الأصناف الخاصة (Private) والتي لا يمكن الوصول إليها من خارج الكائن غير موجودة في بايثون....' |
ط نقل عبد اللطيف ايمش صفحة Python/private-variables إلى Python/private variables |
||
(5 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
متغيرات الأصناف الخاصة (Private) والتي لا يمكن الوصول إليها من خارج | <noinclude>{{DISPLAYTITLE:المتغيرات الخاصة في بايثون}}</noinclude> | ||
لا تدعم بايثون متغيرات الأصناف الخاصة (Private) والتي لا يمكن الوصول إليها من خارج الكائن، ولكن يتفق معظم المبرمجين على أنّ الاسم المسبوق بشرطة سفلية (مثل: <code>_spam</code>) يجب أن يُعامل كجزء غير عام من الواجهة البرمجية (سواء كان ذلك الجزء دالة أم تابعًا أم خاصية). | |||
هناك حالة واحدة تستدعي استخدام عناصر الأصناف الخاصة وهي تجنب حدوث تضارب بين الأسماء الموجودة في الصنف والأسماء المعرّفة في الأصناف الفرعية، ونظرًا لذلك تقدم اللغة دعمًا محدودًا لمثل هذه الحالة، وتدعى بتشويه الأسماء 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/ | تجري عملية التشويه هذه دون الاعتناء بموقع المعرّف اللغوي، ما دام موجودًا داخل كتلة [[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"> | ||
سطر 23: | سطر 24: | ||
== مصادر == | == مصادر == | ||
صفحة [https://docs.python.org/3/tutorial/classes.html#private-variables Classes] في توثيق بايثون الرسمي. | * صفحة [https://docs.python.org/3/tutorial/classes.html#private-variables Classes] في توثيق بايثون الرسمي. | ||
[[تصنيف:Python]] | [[تصنيف:Python]] | ||
[[تصنيف:Python Classes]] | [[تصنيف:Python Classes]] |
المراجعة الحالية بتاريخ 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 في توثيق بايثون الرسمي.