تقنية

init=False في dataclass: هل يلغي استدعاء default_factory؟

بعد Box(): مجموع استدعاءات make هو 1.
البناء يستدعي.

init=False للحقل تستبعده من معاملات التهيئة؛ default_factory تبقى مستدعاة من __init__ المولدة. [1]

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

لا؛ مصنع حقلنا يعمل عند البناء. [1]

  • init=False للحقل تستبعده من معاملات التهيئة؛ default_factory تبقى مستدعاة من __init__ المولدة. [1]
  • على CPython 3.12.14، make تعيد قائمة بعنصر bud وتسجل الاستدعاء؛ حقل items في Box يستخدم init=False وdefault_factory=make. [1]
  • own=Box() تعطي items بقائمة بعنصر bud؛ عدد استدعاءات make يصبح 1. [1]
  • Box(items=["leaf"]) ترفع TypeError؛ يبقى العدد 1، دون استدعاء إضافي للمصنع. [1]
  • تحكم: Plain تقبل items في التهيئة؛ تمرير قائمة leaf يبقي العدد 1. نختبر تهيئة مولدة، وخيار init للحقل، دون تهيئة مخصصة. [1]

معامل التهيئة والمصنع

init=False للحقل تستبعده من معاملات التهيئة؛ default_factory تبقى مستدعاة من __init__ المولدة. [1]

مصنع المثال

على CPython 3.12.14، make تعيد قائمة بعنصر bud وتسجل الاستدعاء؛ حقل items في Box يستخدم init=False وdefault_factory=make. [1]

البناء دون وسيط

own=Box() تعطي items بقائمة بعنصر bud؛ عدد استدعاءات make يصبح 1. [1]

from dataclasses import dataclass,field calls=[] def make():calls.append("make");return ["bud"] @dataclass class Box:items:list=field(init=False,default_factory=make) own=Box() print(own.items,len(calls)) [1]

بعد Plain بالقيمة الصريحة: المجموع 1.
التحكم لا يضيف.

الرفض والتحكم

Box(items=["leaf"]) ترفع TypeError؛ يبقى العدد 1، دون استدعاء إضافي للمصنع. [1]

try:Box(items=["leaf"]) except TypeError:print("TypeError") print(len(calls)) @dataclass class Plain:items:list=field(default_factory=make) control=Plain(items=["leaf"]) print(control.items,len(calls)) [1]

تحكم: Plain تقبل items في التهيئة؛ تمرير قائمة leaf يبقي العدد 1. نختبر تهيئة مولدة، وخيار init للحقل، دون تهيئة مخصصة. [1]

المراجع

  1. Python default factory

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

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