تقنية

frozen في dataclass: هل تقبل __setattr__ مكتوبة في الفئة؟

Bad frozen custom setattr: TypeError.
رفض تعريف الفئة.

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 assignment: FrozenInstanceError.
رفض إسناد المثيل المجمد.

مثيل ناجح وإسناد مرفوض

تحكم: 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]

المراجع

  1. Python frozen and setattr

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

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