تقنية

dataclass في بايثون: هل تستدعي التهيئة المولدة تهيئة الأب؟

في Child: hasattr(own,"mark") تعطي False.
سمة الأب غائبة.

__init__ المولدة من dataclass لا تستدعي __init__ للأب؛ يمكن استدعاؤها صراحة من __post_init__. [1]

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

لا؛ تهيئة Base لا تعمل تلقائيًا هنا. [1]

  • __init__ المولدة من dataclass لا تستدعي __init__ للأب؛ يمكن استدعاؤها صراحة من __post_init__. [1]
  • على CPython 3.12.14، Base فئة عادية؛ تهيئتها تسند mark="bud" وتسجل base. Child ترثها وتعرف حقل number. [1]
  • بعد own=Child(7)، hasattr(own,"mark") تعطي False؛ السمة التي تنشئها تهيئة الأب غائبة. [1]
  • own.number هي 7 والسجل []؛ تهيئة حقل الابنة نجحت دون تشغيل تهيئة Base. [1]
  • تحكم Fixed تستدعي Base.__init__(self) من __post_init__؛ كائنها يحمل number=7 وmark=bud والسجل ["base"]. نختبر أبًا عاديًا واحدًا وتهيئة ابنة مولدة. [1]

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

__init__ المولدة من dataclass لا تستدعي __init__ للأب؛ يمكن استدعاؤها صراحة من __post_init__. [1]

أب عادي وابنة

على CPython 3.12.14، Base فئة عادية؛ تهيئتها تسند mark="bud" وتسجل base. Child ترثها وتعرف حقل number. [1]

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

بعد own=Child(7)، hasattr(own,"mark") تعطي False؛ السمة التي تنشئها تهيئة الأب غائبة. [1]

from dataclasses import dataclass calls=[] class Base: def __init__(self):calls.append("base");self.mark="bud" @dataclass class Child(Base):number:int own=Child(7) print(own.number,hasattr(own,"mark"),calls) [1]

بعد الاستدعاء الصريح في Fixed: mark هي bud.
الاستدعاء ينشئها.

حقل الابنة والتحكم

own.number هي 7 والسجل []؛ تهيئة حقل الابنة نجحت دون تشغيل تهيئة Base. [1]

@dataclass class Fixed(Base): number:int def __post_init__(self):Base.__init__(self) control=Fixed(7) print(control.number,control.mark,calls) [1]

تحكم Fixed تستدعي Base.__init__(self) من __post_init__؛ كائنها يحمل number=7 وmark=bud والسجل ["base"]. نختبر أبًا عاديًا واحدًا وتهيئة ابنة مولدة. [1]

المراجع

  1. Python post-init

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

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