تعد أدوات تزيين بايثون أدوات قوية تسمح لنا بتعديل أو تحسين سلوك الوظائف أو الأساليب. تتضمن حالات الاستخدام الشائعة التسجيل والترخيص والمزيد.
ومع ذلك، عندما يُطلب منك تعريف مصمم الديكور، قد يقول الكثيرون،
إنه غلاف لوظيفة.
على الرغم من أن هذا صحيح من الناحية الفنية، إلا أن هناك الكثير مما يحدث تحت الغطاء.
تشريح ديكور بسيط
دعنا نستكشف مثالًا مباشرًا:
def my_decorator(func): def wrapper(*args, **kwargs): print("Before calling the function") result = func(*args, **kwargs) print("After calling the function") return result return wrapper @my_decorator def say_hello(name): print(f"Hello, {name}!")
هنا، my_decorator هو مُصمم للوظيفة say_hello. عندما يتم تعريف say_hello، يتم تمريره تلقائيًا إلى my_decorator، مما يحول استدعاء الوظيفة إلى:
say_hello = my_decorator(say_hello)
متى يحدث هذا التحول؟
يحدث هذا التحويل أثناء تجميع التعليمات البرمجية، وتحديدًا في وقت تعريف الوظيفة - وليس في وقت التنفيذ.
تفكيك الكود
لفهم كيفية عمل أدوات الديكور على مستوى أدنى، يمكننا استخدام الوحدة dis لفحص الكود الثانوي للدالة المزخرفة:
import dis @my_decorator def say_hello(name): print(f"Hello, {name}!") dis.dis(say_hello)
تحليل الرمز الثانوي
قد يبدو إخراج dis.dis(say_hello) كما يلي:
شرح البايت كود
قبل استدعاء الوظيفة
استدعاء الوظيفة الأصلية
بعد استدعاء الوظيفة
خاتمة
إن مصممي بايثون هم أكثر من مجرد أغلفة وظيفية؛ أنها تمكننا من تعديل سلوك الوظيفة في وقت التعريف. من خلال فهم كيفية عملها وفحص الكود الثانوي، يمكننا استخدام أدوات الديكور بشكل أكثر فعالية في مشاريعنا.
هذا كل ما في الأمر الآن! إذا كان هناك أي شيء آخر تريد مني أن أتعمق فيه، فقط اسمحوا لي أن أعرف!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3