تقنية

methodcaller في بايثون: هل يحفظ الطريقة الحالية؟

saved يستدعي الأصل
bud محفوظ هنا. [1] [2] [3]

حفظ الاسم يختلف عن حفظ الطريقة المرتبطة بالكائن. [1] [2] [3]

الخلاصة السريعة

لا؛ يجلب methodcaller الطريقة بالاسم عند الاستدعاء. [1] [2] [3]

  • نحفظ x.mark في saved قبل التغيير. [1] [2] [3]
  • ننشئ f بالاسم mark دون تمرير الكائن. [1] [2] [3]
  • نستبدل طريقة صنفنا لتعيد leaf. [1] [2] [3]
  • بعدها يعيد saved() القيمة bud، وf(x) القيمة leaf. [1] [2] [3]
  • اختبرنا 3.12.14؛ عدلنا صنف المثال فقط. [1] [2] [3]

المثال

from operator import methodcaller
class T:
    def mark(self):
        return 'bud'
x=T()
saved=x.mark
f=methodcaller('mark')
T.mark=lambda self:'leaf'
print(saved())
print(f(x))

[1] [2] [3]

متى يجلب الطريقة؟

المصدر هنا يجلب السمة من الكائن عند f(x) ثم يستدعيها. المخرجان bud وleaf. بقي saved مرتبطًا بالدالة الأصلية في هذه التجربة، بينما وجد الجلب الجديد طريقة الصنف المستبدلة. [1] [2] [3]

methodcaller يجلب الجديد
leaf بعد التغيير. [1] [2] [3]

النطاق

الكائن نفسه لم يتبدل. هذه ليست نسخة ثابتة من سلوكه؛ قد يخضع الجلب لقواعد سمات مخصصة. لم نغير operator أو نجرب كل أنواع الكائنات. [1] [2] [3]

المراجع

  1. Python 3.12: operator.methodcaller
  2. CPython 3.12.14: operator.py
  3. CPython 3.12.14: _operator.c
  4. موضوع تك: لغة بايثون — مفردات
  5. موضوع تك: تطبيقات بايثون — مفردات

للتوسع: بحث عن لغات البرمجة

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