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

فهم مصممي بايثون: الغوص العميق

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

تعد أدوات تزيين بايثون أدوات قوية تسمح لنا بتعديل أو تحسين سلوك الوظائف أو الأساليب. تتضمن حالات الاستخدام الشائعة التسجيل والترخيص والمزيد.
ومع ذلك، عندما يُطلب منك تعريف مصمم الديكور، قد يقول الكثيرون،

إنه غلاف لوظيفة.

على الرغم من أن هذا صحيح من الناحية الفنية، إلا أن هناك الكثير مما يحدث تحت الغطاء.

تشريح ديكور بسيط
دعنا نستكشف مثالًا مباشرًا:

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) كما يلي:

Understanding Python Decorators: A Deep Dive
شرح البايت كود

  1. قبل استدعاء الوظيفة

    • LOAD_GLOBAL: تحميل وظيفة الطباعة.
    • LOAD_CONST: تحميل الرسالة "قبل استدعاء الوظيفة".
    • CALL_FUNCTION: طباعة المكالمات.
    • POP_TOP: يتجاهل القيمة المرجعة.
  2. استدعاء الوظيفة الأصلية

    • LOAD_DEREF: تحميل الوظيفة الأصلية (func) التي تم التقاطها بواسطة الإغلاق.
    • LOAD_FAST: تحميل الوسائط الموضعية والكلمات الرئيسية.
    • BUILD_MAP: إنشاء قاموس جديد لوسائط الكلمات الرئيسية.
    • CALL_FUNCTION_EX: استدعاء الدالة الأصلية باستخدام الوسائط.
    • STORE_FAST: يخزن النتيجة في متغير محلي.
  3. بعد استدعاء الوظيفة

    • مثل الجزء الأول، فإنه يستدعي الطباعة للإخراج "بعد استدعاء الوظيفة".
    • إرجاع النتيجة
    • تحميل متغير النتيجة وإعادته.

خاتمة
إن مصممي بايثون هم أكثر من مجرد أغلفة وظيفية؛ أنها تمكننا من تعديل سلوك الوظيفة في وقت التعريف. من خلال فهم كيفية عملها وفحص الكود الثانوي، يمكننا استخدام أدوات الديكور بشكل أكثر فعالية في مشاريعنا.

هذا كل ما في الأمر الآن! إذا كان هناك أي شيء آخر تريد مني أن أتعمق فيه، فقط اسمحوا لي أن أعرف!

بيان الافراج تم نشر هذه المقالة على: https://dev.to/aman-giri/understanding-python-decorators-a-deep-dive-pp0?1 إذا كان هناك أي انتهاك، فيرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3