تقنية

ClassVar في dataclass: هل تصبح وسيطًا للتهيئة؟

Box(4,kind="leaf") ترفع TypeError.
وسيط kind مرفوض.

ClassVar مستبعدة من حقول dataclass؛ لا تصبح وسيطًا في تهيئتنا المولدة. [1]

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

لا؛ kind ليست وسيط تهيئة هنا. [1]

  • ClassVar مستبعدة من حقول dataclass؛ لا تصبح وسيطًا في تهيئتنا المولدة. [1]
  • على CPython 3.12.14، Box تعرف number:int وkind:ClassVar[str]="bud"؛ نستورد ClassVar مباشرة من typing. [1]
  • Box(4,kind="leaf") ترفع TypeError؛ تمرير kind باسمها لا يجعلها وسيطًا مقبولًا. [1]
  • أسماء حقول fields(Box) تضم number فقط؛ Box.kind تبقى bud على الفئة، رغم استبعادها من الحقول. [1]
  • تحكم Plain تعرف kind:str="bud" حقلًا عاديًا؛ Plain(4,kind="leaf") تنجح، وcontrol.kind هي leaf. نختبر تهيئة مولدة بلا وراثة أو تخصيص. [1]

متغير الفئة والحقول

ClassVar مستبعدة من حقول dataclass؛ لا تصبح وسيطًا في تهيئتنا المولدة. [1]

التعليق في المثال

على CPython 3.12.14، Box تعرف number:int وkind:ClassVar[str]="bud"؛ نستورد ClassVar مباشرة من typing. [1]

رفض الوسيط

Box(4,kind="leaf") ترفع TypeError؛ تمرير kind باسمها لا يجعلها وسيطًا مقبولًا. [1]

from dataclasses import dataclass,fields from typing import ClassVar @dataclass class Box: number:int kind:ClassVar[str]="bud" try:Box(4,kind="leaf") except TypeError:print("TypeError") print([item.name for item in fields(Box)],Box.kind) [1]

control.kind من Plain هي leaf.
الحقل العادي يقبل.

الحقول والتحكم

أسماء حقول fields(Box) تضم number فقط؛ Box.kind تبقى bud على الفئة، رغم استبعادها من الحقول. [1]

@dataclass class Plain: number:int kind:str="bud" control=Plain(4,kind="leaf") print(control.number,control.kind) [1]

تحكم Plain تعرف kind:str="bud" حقلًا عاديًا؛ Plain(4,kind="leaf") تنجح، وcontrol.kind هي leaf. نختبر تهيئة مولدة بلا وراثة أو تخصيص. [1]

المراجع

  1. Python ClassVar

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

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