تنفيذ السلوك الشبيه بالفئة في الوحدات النمطية ديناميكيًا باستخدام 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