الوسائِل السَّاكِنة - static methods


الوسائِل السَّاكِنة - static methods

الوسائِل السَّاكِنة

هِيَ وسائِل عاديَّة كالَّتي تُعرِّفها في مجالِ بايثون العالمي بِإستخدام الإِفادة def.
لكن هي معروفة فقط في المجال المحلي الخاص بالصنف class والكائن(نموذج) (instance(object المأخوذ من الصنف ، لها عدة غايات منها تنظيم وحدتك(مكتبتك) (module(librarry بحيث أنه بدلا من تعريف العديد من الدوال المستخدمة ضمن الأصناف والكائنات المشتقة منها في فضاء الأسماء names space الخاص بوحدتك وجعل وحدتك أو برنامجك غير مقروء بالشكل الأمثل وبعيدا كل البعد عن التنظيم الذي تطمح له لغة بايثون للبرمجة, يتم تعريف تلك الدوال functions في الأصناف كدوال(في الأصناف تسمى وسائل) ساكنة: ليست مرتبطة بالصنف أو بكائنه بالمعنى المتعارف عليه(أي: لا تحتاج المعطى self) بل هي فقط معروفة من قبل الصنف وكائناته لكن في الخارج هي ليست معروفة وإستخدامها خارجاً يرفع خطأً:

NameError: name 'FunctionName' is not defined


* إستخدام الوسائل الساكنة في وحدتك يجعل عملية جلب الوحدة عند إستخدامها أنظف وأسرع، فهي تبعد دالتك خارج فضاء الأسماء العالمي وذلك أفضل.
* لا تعرف الوسيلة الساكنة شيئا عن الصنف أو الكائن الذي أستدعيت فيه، هي فقط تأخذ الجدليات التي تمرر لها دون إيضاح(تحديد)(إجبار) لأول جدلية -- أساسا هي دون فائدة في بايثون فيمكنك أن تستخدم دالة وحدة(دالة عادية) عوضا عنها.
* يمكن للوسائل الساكنة أن تورث وأيضا أن يتم السيطرة عليها overridden مثل وسائل الأخرى المربوطة التي إعتدنا تعريفها عند كتابتنا للأصناف.
* لا تستقبل الوسيلة الساكنة جدلية أولى جليَّة.
* لإعلان وسيلة ساكنة إستخدم الإصطلاح:

حيثُ أنَّ @staticmethod هو مُزَيِّنٌ decorator أُضيف للأصناف في الإصدارات اللَّاحقة(بايثون>2,4)

أو كبديلٍ، ضَع سطراً بعد تعريف الدَّالة وفي نفس المستوى(في نفس مستوى def الخاصة بها) هكذا:

ويمكنك أيضا إستيراد(جلب) دالة عادية من فضاء الأسماء العالمي إلى صنفك، كما أوضح في هذا المثال:
مثال 1: تحويل دالة عاديَّة إلى وسيلة ساكنة.

==> كما قد لاحظت، فمن الممكن إستدعاء الوسيلة الساكنة على الصنف أو كائنه. كما هُنا:

>>> obj.global_function()
I'm a global function
>>> SomeClass.global_function()
I'm a global function



* الوسيلة الساكنة ليست إلَّا دالَّة عاديَّة مُعرَّفة داخل الصِّنف، يُمكن إستدعائُها دون القيام بنمذجة instantiate الصنف أولًا، كما هُنا:

>>> SomeClass.global_function()
I'm a global function



* بإستخدامك للوسيلة الساكنة أنت لست مرتبطا بالصنف دائمًا -هذا إعتقادٌ خاطِئ- فأنت لست مرتبطًا على الإطلاق، وليس هناك من معطى أوَّل واضح.

* ليس للوسيلة الساكنة قُدرة على الولوج access المباشَر إلى الوسائل أو الصِّفات(خواص) (attributes(properties الأُخرى في الصِّنف، فَستحتاج إِلى تَصْلِيْدِ الشِّفْرَةِ hardcode‏ هكذا:

MyClass.attribute
MyClass.method()


مثال 2: إستخدامُ وتعريفِ الوسيلةِ السَّاكنةِ مَعَ بَعضِ المُلاحظاتِ العَمليَّةِ.

ليست هناك تعليقات:

إرسال تعليق