تقنية

replace في بايثون: حقل يعاد حسابه ولا ينسخ

الحقل 99 يصبح 10 في الكائن الجديد
الأصل يحتفظ بالقيمة 99. [1] [2]

إعادة الإنشاء قد تغير الحقل المشتق. [1] [2]

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

replace ينشئ كائنًا جديدًا؛ حقل init=False لا ينسخ من الأصل. [1] [2]

  • نحسب y=2*x في __post_init__؛ ليس y وسيط التهيئة. [1] [2]
  • a=C(4) يبدأ بـy=8؛ نعدل a.y=99 يدويًا. [1] [2]
  • replace(a,x=5) يعطي b.x=5,b.y=10؛ يبقى a عند (4,99). [1] [2]
  • replace(a,y=7) يرفع ValueError لأن y حقل init=False. [1] [2]
  • جربنا 3.12.14 مع تهيئة مولدة وفئة قابلة للتعديل؛ التهيئة المخصصة خارج المثال. [1] [2]

المثال

from dataclasses import dataclass,field,replace
@dataclass
class C:
    x:int
    y:int=field(init=False)
    def __post_init__(self):
        self.y=2*self.x
a=C(4)
a.y=99
b=replace(a,x=5)
print(a.x,a.y,b.x,b.y)

[1] [2]

الناتج: 4 99 5 10. [1] [2]

التفسير

تستدعي replace التهيئة. في فئتنا المولدة، تعمل __post_init__ فتحسب 2*5=10؛ لا تستعيد 99. الكائن الجديد مختلف عن a. [1] [2]

القيد

أما replace(a,y=7) فيفشل؛ لا تمرر حقل init=False ضمن التغييرات. [1] [2]

تغيير x مسموح؛ تغيير y مرفوض
y حقل init=False. [1] [2]

النطاق

القاعدة العددية مؤلفة للفئة المعروضة. لم نستعمل حقولًا متداخلة أو تهيئة مخصصة؛ لا نعمم هذا الحساب على كل فئة. [1] [2]

المراجع

  1. Python: dataclasses.replace
  2. CPython 3.12.14: replace
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

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