ما هي الطرق السحرية في بايثون وكيفية استخدامها

إحدى ميزات Python الأقل شهرة والقيمة هي القدرة على تنفيذ الأساليب السحرية على الكائنات. باستخدام الأساليب السحرية ، يمكننا كتابة كود أنظف يكون بديهيًا وسهل الفهم.

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

ما هي طرق السحر؟

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

نتيجة لذلك ، يطلق عليهم عادةً أساليب dunder ، كما هو الحال في الشرطة السفلية المزدوجة. طريقة dunder الشائعة التي قد تكون صادفتها بالفعل هي طريقة __init __ () المستخدمة لتعريف مُنشئ الفئة.

عادةً ، لا يُقصد باستدعاء أساليب dunder مباشرة في التعليمات البرمجية الخاصة بك ؛ بدلاً من ذلك ، سوف يستدعيهم المترجم الفوري أثناء تشغيل البرنامج.

لماذا تعتبر طرق السحر مفيدة؟

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

🟢 العمليات الحسابية

🟢 عمليات المقارنة

🟢 عمليات دورة الحياة

عمليات التمثيل

سيناقش القسم التالي كيفية تنفيذ الأساليب السحرية التي تحدد سلوك التطبيق عند استخدامه في جميع الفئات المذكورة أعلاه.

كيفية تحديد طرق السحر

كما ذكرنا سابقًا ، تحدد الطرق السحرية سلوك الكائنات. على هذا النحو ، يتم تعريفهم كجزء من فئة الكائن. لأنهم جزء من فئة الكائن ، فإنهم يأخذون كأول وسيطة ذاتية وهي إشارة إلى الكائن نفسه.

  كيف يمكن أن يساعدك رواية القصص على إنهاء عملية البيع

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

تطبيق

الكثير مما ناقشناه حتى الآن يبدو نظريًا ومجرّدًا. في هذا القسم ، سنقوم بتطبيق فئة Rectangle بسيطة.

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

تهيئة بيئة الترميز

لمتابعة هذه الإرشادات التفصيلية ، ستحتاج إلى بيئة وقت تشغيل Python. يمكنك استخدام واحد محلي ، أو يمكنك استخدام مترجم admingate.org Python عبر الإنترنت.

إنشاء فئة المستطيل

أولاً ، لنبدأ بتحديد فئة المستطيل.

class Rectangle:
    pass

إنشاء طريقة الباني

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

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

إنشاء طريقة سحرية لتمثيل السلاسل

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

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

يجب أن تُرجع طريقة __str __ () سلسلة نصية تريد تمثيل الكائن بها. في هذه الحالة ، نعيد سلسلة من تنسيق Rectangle (، ) حيث الطول والعرض هما الأبعاد المخزنة للمستطيل.

إنشاء طرق سحرية لعمليات المقارنة

بعد ذلك ، نريد إنشاء عوامل تشغيل مقارنة لعمليات يساوي وأقل من وأكبر من. وهذا ما يسمى التحميل الزائد للمشغل. لإنشاء هذه ، نستخدم الطرق السحرية __eq__ و __lt__ و __gt__ على التوالي. ستعيد هذه الطرق قيمة منطقية بعد مقارنة مناطق المستطيلات.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

    def __eq__(self, other):
        """ Checking for equality """
        return self.height * self.width == other.height * other.width

    def __lt__(self, other):
        """ Checking if the rectangle is less than the other one """
        return self.height * self.width < other.height * other.width

    def __gt__(self, other):
        """ Checking if the rectage is greater than the other one """
        return self.height * self.width > other.height * other.width

كما ترى ، تأخذ هذه الطرق معاملين. الأول هو المستطيل الحالي ، والثاني هو القيمة الأخرى التي تتم مقارنتها بها. يمكن أن تكون هذه القيمة مثيل Rectangle آخر أو أي قيمة أخرى. إن المنطق الخاص بكيفية المقارنة والظروف التي ستعود المقارنة بموجبها صحيحًا متروك لك تمامًا.

  هل رسوم AT&T لاستبدال بطاقة SIM؟

طرق السحر الشائعة

في هذا القسم التالي ، سنناقش الطرق السحرية الشائعة التي ستواجهها وتستخدمها.

# 1. عمليات حسابية

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

NameMethodSignDescriptionAddition__add __ + ينفذ إضافة. الطرح __الفرعي __- يطبق الطرح. الضرب __ الجزيء __ * يطبق الضربالقسم __قسم __ / قسم التنفيذ.

# 2. عمليات المقارنة

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

NameMethodSignDescription أقل من __lt __ <ينفذ أقل من المقارنة أكبر من__gt __> يطبق أكبر من المقارنة يساوي __Eq __ == يطبق ما يساوي مقارنة أقل من أو يساوي __le __> = يطبق أقل من أو يساوي المقارنة أكبر من أو يساوي __ أكبر من أو يساوي مقارنة

# 3. عمليات دورة الحياة

سيتم استدعاء هذه الطرق استجابة لأساليب دورة الحياة المختلفة لكائن ، مثل إنشاء مثيل له أو حذفه. تندرج المُنشئ __init__ ضمن هذه الفئة. يتم سرد الطرق الشائعة في هذه الفئة في الجدول أدناه:

  إصلاح رمز خطأ Hulu 2998

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

# 4. عمليات التمثيل

NameMethodDescriptionStr__str__ يعيد تمثيل سلسلة للكائن يمكن قراءته بواسطة الإنسان. يتم استدعاء هذه الطريقة عند استدعاء دالة str () ، لتمرير مثيل من الفئة كوسيطة. يتم استدعاؤه أيضًا عند تمرير المثيل إلى وظائف print () و format (). من المفترض أن توفر سلسلة مفهومة من قبل المستخدم النهائي للتطبيق. Repr__repr__ يعيد تمثيل سلسلة للكائن الذي يستخدمه المطور. من الناحية المثالية ، يجب أن تكون السلسلة التي يتم إرجاعها غنية بالمعلومات بحيث يمكنك إنشاء مثيل متطابق للكائن من السلسلة فقط.

أفضل الممارسات لإنشاء طرق السحر

الأساليب السحرية لا تصدق وستعمل على تبسيط التعليمات البرمجية الخاصة بك. ومع ذلك ، من المهم مراعاة الأمور التالية عند استخدامها.

  • استخدمها باعتدال – إن تنفيذ الكثير من الأساليب السحرية في فصولك الدراسية يجعل من الصعب فهم الكود الخاص بك. اقتصر على تنفيذ الأساسيات فقط.
  • تأكد من فهم الآثار المترتبة على أداء طرق مثل __setatrr__ و __getattr__ قبل استخدامها.
  • وثق سلوك طرقك السحرية حتى يعرف المطورون الآخرون بالضبط ما يفعلونه. هذا يسهل عليهم استخدامها وتصحيح الأخطاء عند الضرورة.

الكلمات الأخيرة

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

بعد ذلك ، قد ترغب في معرفة كيفية تنفيذ فئة Counter في Python.