frozen=True لا تقبل __setattr__ مكتوبة داخل الفئة؛ يرفع المزخرف TypeError عند التعريف. [1]
الخلاصة السريعة
لا؛ تعريف Bad يرفض هنا. [1]
- frozen=True لا تقبل __setattr__ مكتوبة داخل الفئة؛ يرفع المزخرف TypeError عند التعريف. [1]
- على CPython 3.12.14، Bad تعرف number:int وطريقة __setattr__ تسجل أسماء الاستدعاءات في calls؛ نطبق @dataclass(frozen=True). [1]
- التعريف يرفع TypeError قبل إنشاء مثيل؛ calls تبقى فارغة، فلم تستدع الطريقة في اختبارنا. [1]
- تحكم: Fixed تستخدم frozen=True وحقل number:int دون __setattr__ مخصصة؛ control=Fixed(4) تنجح. [1]
- control.number=9 ترفع FrozenInstanceError، وتبقى control.number هي 4. رفض التعريف يختلف عن رفض الإسناد إلى مثيل ناجح؛ لا نختبر وراثة أو فتحات أو تجاوز الحماية. [1]
شرط التعريف
frozen=True لا تقبل __setattr__ مكتوبة داخل الفئة؛ يرفع المزخرف TypeError عند التعريف. [1]
طريقة مكتوبة في الفئة
على CPython 3.12.14، Bad تعرف number:int وطريقة __setattr__ تسجل أسماء الاستدعاءات في calls؛ نطبق @dataclass(frozen=True). [1]
رفض المزخرف
التعريف يرفع TypeError قبل إنشاء مثيل؛ calls تبقى فارغة، فلم تستدع الطريقة في اختبارنا. [1]
from dataclasses import dataclass,FrozenInstanceError calls=[] try: @dataclass(frozen=True) class Bad: number:int def __setattr__(self,name,value):calls.append(name) except TypeError:print("TypeError") print(calls) [1]

مثيل ناجح وإسناد مرفوض
تحكم: Fixed تستخدم frozen=True وحقل number:int دون __setattr__ مخصصة؛ control=Fixed(4) تنجح. [1]
@dataclass(frozen=True) class Fixed:number:int control=Fixed(4) try:control.number=9 except FrozenInstanceError:print("FrozenInstanceError") print(control.number) [1]
control.number=9 ترفع FrozenInstanceError، وتبقى control.number هي 4. رفض التعريف يختلف عن رفض الإسناد إلى مثيل ناجح؛ لا نختبر وراثة أو فتحات أو تجاوز الحماية. [1]
المراجع
للتوسع: لغات البرمجة.
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
