تقنية

resolve_bases في بايثون: هل تستدعي __mro_entries__ للفئة نفسها؟

resolve_bases; Choice.__mro_entries__; bases=(Choice,); isinstance(Choice,type):True; out is bases:True; calls=[]
تجاوز الفئة.

لا؛ وجود الطريقة في Choice لا يكفي، لأنها فئة فعلية هنا. [1] [2]

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

لا في مثال الفئة. [1] [2]

  • لا؛ وجود الطريقة في Choice لا يكفي، لأنها فئة فعلية هنا. [1] [2]
  • في CPython 3.12.14، Choice تعرف __mro_entries__ لتسجل hook وتعيد (Base,)؛ نمرر (Choice,) إلى resolve_bases. [1] [2]
  • تبقى Choice دون استدعاء الطريقة؛ out is bases تعطي True وcalls=[]. [1] [2]
  • التنفيذ يفحص isinstance(base,type) أولًا لكل عنصر base؛ إن كانت True يتجاوزه قبل البحث عن الطريقة. [1] [2]
  • تحكم: marker=Choice() ليس فئة؛ الطريقة تنفذ، والناتج (Base,) وcalls=["hook"]. نفحص حل القواعد، دون إنشاء فئة مشتقة أو ميتا مخصصة. [1] [2]

شرط النوع

لا؛ وجود الطريقة في Choice لا يكفي، لأنها فئة فعلية هنا. [1] [2]

طريقة موجودة

في CPython 3.12.14، Choice تعرف __mro_entries__ لتسجل hook وتعيد (Base,)؛ نمرر (Choice,) إلى resolve_bases. [1] [2]

تجاوز الفئة

تبقى Choice دون استدعاء الطريقة؛ out is bases تعطي True وcalls=[]. [1] [2]

from types import resolve_bases calls=[] class Base:pass class Choice: def __mro_entries__(self,bases): calls.append("hook");return (Base,) bases=(Choice,);out=resolve_bases(bases) print(out is bases,calls) [1] [2]

resolve_bases; Choice.__mro_entries__; marker=Choice(); bases=(marker,); out==(Base,):True; calls=["hook"]
استدعاء للنسخة.

الشرط والتحكم

التنفيذ يفحص isinstance(base,type) أولًا لكل عنصر base؛ إن كانت True يتجاوزه قبل البحث عن الطريقة. [1] [2]

marker=Choice();bases=(marker,) out=resolve_bases(bases) print(out==(Base,),calls) [1] [2]

تحكم: marker=Choice() ليس فئة؛ الطريقة تنفذ، والناتج (Base,) وcalls=["hook"]. نفحص حل القواعد، دون إنشاء فئة مشتقة أو ميتا مخصصة. [1] [2]

المراجع

  1. Python types
  2. CPython types

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

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