تقنية

frozen في dataclass: هل يقبل المزخرف ابنة غير مجمدة؟

frozen Base; non-frozen Child: TypeError.
تعريف الابنة مرفوض.

يرفض مزخرف dataclass ابنة غير مجمدة لأب dataclass مجمد. [1] [2]

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

لا؛ تعريف ابنتنا يرفع TypeError. [1] [2]

  • يرفض مزخرف dataclass ابنة غير مجمدة لأب dataclass مجمد. [1] [2]
  • على CPython 3.12.14، Base تستخدم frozen=True وحقل number؛ Child ترثها وتضيف label، بمزخرف dataclass دون تحديد frozen. [1] [2]
  • افتراضي frozen هو False؛ تطبيق مزخرف Child يرفع TypeError أثناء التعريف، قبل إنشاء مثيل. [1] [2]
  • بعد التقاط الخطأ، Child غير مربوط في نطاقنا الجديد. [1] [2]
  • تحكم: Fixed ترث Base وتستخدم frozen=True؛ control=Fixed(4,"bud") تنجح، وcontrol.number هي 4 وcontrol.label هي bud. نختبر أبًا واحدًا وابنتين مزخرفتين؛ الابنة العادية غير المزخرفة خارج المثال. [1] [2]

شرط التجميد

يرفض مزخرف dataclass ابنة غير مجمدة لأب dataclass مجمد. [1] [2]

الأب والابنة

على CPython 3.12.14، Base تستخدم frozen=True وحقل number؛ Child ترثها وتضيف label، بمزخرف dataclass دون تحديد frozen. [1] [2]

رفض التعريف

افتراضي frozen هو False؛ تطبيق مزخرف Child يرفع TypeError أثناء التعريف، قبل إنشاء مثيل. [1] [2]

from dataclasses import dataclass @dataclass(frozen=True) class Base:number:int try: @dataclass class Child(Base):label:str except TypeError:print("TypeError") print("Child" in globals()) [1] [2]

frozen Base; frozen Fixed: accepted.
التجميد متوافق.

الاسم والتحكم

بعد التقاط الخطأ، Child غير مربوط في نطاقنا الجديد. [1] [2]

@dataclass(frozen=True) class Fixed(Base):label:str control=Fixed(4,"bud") print(control.number,control.label) [1] [2]

تحكم: Fixed ترث Base وتستخدم frozen=True؛ control=Fixed(4,"bud") تنجح، وcontrol.number هي 4 وcontrol.label هي bud. نختبر أبًا واحدًا وابنتين مزخرفتين؛ الابنة العادية غير المزخرفة خارج المثال. [1] [2]

المراجع

  1. Python dataclass
  2. CPython 3.12.14 inheritance

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

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