تقنية

init=False في dataclass: هل تستدعي __post_init__ تلقائيًا؟

Box post-init calls: 0.
استدعاءات Box: صفر.

init=False للمزخرف تمنع توليد __init__؛ دون تهيئة مولدة، __post_init__ لا تستدعى تلقائيًا. [1]

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

لا؛ وجود الطريقة وحده لا يشغلها. [1]

  • init=False للمزخرف تمنع توليد __init__؛ دون تهيئة مولدة، __post_init__ لا تستدعى تلقائيًا. [1]
  • على CPython 3.12.14، Box تعرف number وتهيئة مخصصة تسنده؛ __post_init__ تسجل box وتضيف 1، لكنها غير مستدعاة من تهيئتنا. [1]
  • own=Box(4): own.number تبقى 4 والسجل فارغ؛ الاستدعاء اللاحق لم يحدث. [1]
  • هذا init=False على dataclass، وليس خيارًا على field؛ المثال بلا وراثة. [1]
  • تحكم مستقل: Plain لها تهيئة مولدة و__post_init__ تسجل plain وتضيف 1. بعد control=Plain(4)، control.number هي 5 والسجل يحوي plain وحدها؛ own.number تبقى 4. [1]

التهيئة المولدة

init=False للمزخرف تمنع توليد __init__؛ دون تهيئة مولدة، __post_init__ لا تستدعى تلقائيًا. [1]

تهيئة مخصصة

على CPython 3.12.14، Box تعرف number وتهيئة مخصصة تسنده؛ __post_init__ تسجل box وتضيف 1، لكنها غير مستدعاة من تهيئتنا. [1]

السجل الفارغ

own=Box(4): own.number تبقى 4 والسجل فارغ؛ الاستدعاء اللاحق لم يحدث. [1]

from dataclasses import dataclass calls=[] @dataclass(init=False) class Box: number:int def __init__(self,number):self.number=number def __post_init__(self):calls.append("box");self.number+=1 own=Box(4) print(own.number,calls) [1]

Plain post-init calls: 1.
استدعاءات Plain: واحد.

موضع الخيار والتحكم

هذا init=False على dataclass، وليس خيارًا على field؛ المثال بلا وراثة. [1]

@dataclass class Plain: number:int def __post_init__(self):calls.append("plain");self.number+=1 control=Plain(4) print(control.number,calls,own.number) [1]

تحكم مستقل: Plain لها تهيئة مولدة و__post_init__ تسجل plain وتضيف 1. بعد control=Plain(4)، control.number هي 5 والسجل يحوي plain وحدها؛ own.number تبقى 4. [1]

المراجع

  1. Python post-init

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

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