"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنك محاكاة السلوك الشبيه بالفصل في وحدات بايثون؟

كيف يمكنك محاكاة السلوك الشبيه بالفصل في وحدات بايثون؟

تم النشر بتاريخ 2024-11-16
تصفح:341

How Can You Mimic Class-Like Behavior in Python Modules?

تنفيذ السلوك الشبيه بالفئة في الوحدات النمطية ديناميكيًا باستخدام getattr

في بعض السيناريوهات، قد يكون من المرغوب فيه التقليد سلوك __getattr__ في فصل دراسي ولكن لوحدة نمطية بأكملها. يسمح هذا بالإنشاء الديناميكي لمثيلات الفئة واستدعاء أساليبها بناءً على عمليات البحث عن السمات في الوحدة النمطية.

ومع ذلك، فإن محاولة تعريف أسلوب __getattr__ مباشرة على الوحدة النمطية تواجه عقبتين:

  • تقوم بايثون فقط بالتحقق من مثل هذه الأساليب في الفئات.
  • تعديل نوع الوحدة الأساسية (الوحدة النمطية) للسماح بإعداد السمة ليس ممكنًا.

الحل القائم على المجمع

أحد الأساليب هو إنشاء غلاف حول الوحدة. تتسامح Sys.modules مع أنواع الكائنات المختلفة، لذا يمكننا تغليف الوحدة داخل فئة وتعيينها إلى sys.modules[__name__]. وهذا يسمح بالسلوك الديناميكي دون تعديل الوحدة نفسها. ومع ذلك، فإن هذه التقنية تنطبق فقط على الوصول على مستوى الوحدة.

اختراق Guido van Rossum

يتضمن الحل الآخر الذي اقترحه Guido van Rossum استبدال الوحدة الفعلية في sys. الوحدات النمطية مع مثيل لفئة محددة داخل الوحدة النمطية. تقوم آلية الاستيراد بخطوة الاستبدال النهائية هذه، مما يتيح هذا الاختراق. يوضح المثال التالي هذا الأسلوب:

# module foo.py

import sys

class Foo:
    def funct1(self, *args):
        
    def funct2(self, *args):
        

sys.modules[__name__] = Foo()

الآن، يمكن الوصول إلى الوظائف المحددة في الوحدة عبر مثيل Foo.

الاعتبارات

عند استخدام هذه التقنيات، قد لا يمكن الوصول إلى عناصر الوحدة الأخرى بعد تعيين sys.modules. حدد جميع الوظائف الضرورية داخل فئة الاستبدال لتجنب فقدان محتوى الوحدة النمطية.

__all__ Attribute

عند الاستخدام من وحدة الاستيراد *، حدد __all__ في فئة الاستبدال للتعامل مع هذا نوع بيان الاستيراد. احذف سمات مثل __module__ و__qualname__ من __all__.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3