تقنية

finalize في بايثون: alive لا تقيس بقاء الكائن

حالة المنهي وبقاء الكائن
الكائن باقٍ بعد f(). [1] [2]

افصل حالة المنهي عن الكائن. [1] [2]

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

f.alive=False لا يعني اختفاء obj؛ يمكن استدعاء المنهي يدويًا والكائن باقٍ. [1] [2]

  • قبل الاستدعاء: كلا الفحصين يعطي True. [1] [2]
  • أول f() يعيد 7 من دالة التنظيف. [1] [2]
  • بعده: f.alive=False والكائن باقٍ. [1] [2]
  • ثاني f() يعيد None دون تكرار الدالة. [1] [2]
  • المثال في 3.12.14؛ دالته لا تحتفظ بالكائن، وتوقيت جمع القمامة خارج نطاقه. [1] [2]

المثال

import weakref
class C: pass
obj=C()
probe=weakref.ref(obj)
def cleanup(): return 7
f=weakref.finalize(obj,cleanup)
print(f.alive,probe() is obj)
print(f(),f.alive,probe() is obj)
print(f())

[1] [2]

الناتج: True True ثم 7 False True ثم None. [1] [2]

حالتان

alive تخص المنهي؛ يحتفظ obj بمرجع قوي إلى الكائن. انتهاء المنهي لا يحذفه. [1] [2]

الاستدعاء التالي

إعادة f() لا تعيد تشغيل cleanup. في التنفيذ المثبت، يزيل أول استدعاء قيد المنهي من سجله. [1] [2]

نتيجة الاستدعاء الأول والثاني
الدالة تعمل مرة واحدة. [1] [2]

النطاق

فئة عادية تدعم المرجع الضعيف؛ لا يحتفظ cleanup بالكائن. لا نفحص الإغلاق أو detach هنا. [1] [2]

المراجع

  1. Python: weakref وfinalize
  2. CPython 3.12.14: weakref.py
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

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