تقنية

new_class في بايثون: هل يصبح القاموس المعاد نطاق الفئة؟

السمة mark غائبة بعد returning.
إرجاع قاموس.

exec_body تملأ نطاق الأسماء المعطى؛ إرجاع قاموس وحده لا يملؤه. [1] [2]

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

لا؛ حدّث النطاق الذي تستقبله. [1] [2]

  • exec_body تملأ نطاق الأسماء المعطى؛ إرجاع قاموس وحده لا يملؤه. [1] [2]
  • على CPython 3.12.14، returning تعيد قاموسًا فيه mark بقيمة bud، دون تحديث ns. [1] [2]
  • hasattr(Returned,"mark") تعطي False؛ استدعاء returning حدث، لكن قاموسها المعاد لم يصبح نطاق الفئة. [1] [2]
  • التحكم populating تكتب ns["mark"]="bud"؛ Populated.mark تعطي bud. كلا الاستدعاءين بقواعد فارغة وصنف ميتا افتراضي. [1] [2]
  • المصدر يستدعي exec_body(ns) دون حفظ ناتجها، ثم يمرر ns لإنشاء الفئة. لا يختبر المثال أصنافًا ميتا مخصصة. [1] [2]

تعبئة النطاق

exec_body تملأ نطاق الأسماء المعطى؛ إرجاع قاموس وحده لا يملؤه. [1] [2]

قاموس معاد

على CPython 3.12.14، returning تعيد قاموسًا فيه mark بقيمة bud، دون تحديث ns. [1] [2]

السمة الغائبة

hasattr(Returned,"mark") تعطي False؛ استدعاء returning حدث، لكن قاموسها المعاد لم يصبح نطاق الفئة. [1] [2]

from types import new_class def returning(ns): return {"mark":"bud"} Returned=new_class("Returned",(),{},returning) print(hasattr(Returned,"mark")) [1] [2]

Populated.mark تساوي bud.
تحديث النطاق.

التحديث والتحكم

التحكم populating تكتب ns["mark"]="bud"؛ Populated.mark تعطي bud. كلا الاستدعاءين بقواعد فارغة وصنف ميتا افتراضي. [1] [2]

def populating(ns): ns["mark"]="bud" Populated=new_class("Populated",(),{},populating) print(Populated.mark) [1] [2]

المصدر يستدعي exec_body(ns) دون حفظ ناتجها، ثم يمرر ns لإنشاء الفئة. لا يختبر المثال أصنافًا ميتا مخصصة. [1] [2]

المراجع

  1. Python new_class
  2. CPython 3.12.14 types

للتوسع: لغات البرمجة.

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