تقنية

_make في namedtuple: هل تستدعي __new__ للصنف الفرعي؟

namedtuple; Own(T); __new__:value*2; Own._make([4]); value:4; own_calls:[]
تجاوز.

_make الموروثة تتجاوز __new__ المخصصة في مثالنا. [1] [2]

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

لا؛ لا تستدعيها هنا. [1] [2]

  • _make الموروثة تتجاوز __new__ المخصصة في مثالنا. [1] [2]
  • على CPython 3.12.14، T بحقل value؛ Own(T) تخصص __new__ لتسجيل المدخل ومضاعفته. [1] [2]
  • Own._make([4]) تنتج Own بقيمة 4 وسجل فارغ؛ القائمة تبقى [4]. [1] [2]
  • _make تستعمل tuple.__new__(cls,iterable) مباشرة. [1] [2]
  • تحكم Control(T) مستقل يخصص __new__ بالطريقة نفسها بسجل مستقل؛ Control(4) تعطي 8 وتسجل [4]. لم نخصص _make أو __init__. [1] [2]

التجاوز

_make الموروثة تتجاوز __new__ المخصصة في مثالنا. [1] [2]

الصنف الفرعي

على CPython 3.12.14، T بحقل value؛ Own(T) تخصص __new__ لتسجيل المدخل ومضاعفته. [1] [2]

الصنع الموروث

Own._make([4]) تنتج Own بقيمة 4 وسجل فارغ؛ القائمة تبقى [4]. [1] [2]

from collections import namedtuple T=namedtuple("T","value") own_calls=[] class Own(T): __slots__=() def __new__(cls,value): own_calls.append(value) return T.__new__(cls,value*2) items=[4] own=Own._make(items) print(own.value,type(own) is Own,own_calls,items) [1] [2]

Control(T); __new__:value*2; Control(4); value:8; control_calls:[4]
استدعاء.

استدعاء الصنف

_make تستعمل tuple.__new__(cls,iterable) مباشرة. [1] [2]

control_calls=[] class Control(T): __slots__=() def __new__(cls,value): control_calls.append(value) return T.__new__(cls,value*2) control=Control(4) print(control.value,type(control) is Control,control_calls) [1] [2]

تحكم Control(T) مستقل يخصص __new__ بالطريقة نفسها بسجل مستقل؛ Control(4) تعطي 8 وتسجل [4]. لم نخصص _make أو __init__. [1] [2]

المراجع

  1. Python namedtuple
  2. CPython namedtuple

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

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