Ali Ali38 نشر 11 سبتمبر 2022 أرسل تقرير نشر 11 سبتمبر 2022 لقد تعلمت أنه يوجد طريقتين في الأصناف هما __new__ و __init__ لكن لم أفهم الفرق بينهما و متى يتم استعمال كل منهما؟ 1 اقتباس
1 Kais Hasan نشر 11 سبتمبر 2022 أرسل تقرير نشر 11 سبتمبر 2022 (معدل) إن الطريقة __new__ تقوم بإنشاء غرض جديد من الصنف المطلوب بينما الطريقة __init__ تقوم بتهيئته بالقيم المطلوبة و بالتالي فإن __new__ تقوم بإعادة غرض من هذا الصنف بينما __init__ لا ترجع شيئاً. عندما نقوم بتعريف كائن من صف فإننا نستعمل الباني، و هو فعلياً يقوم في البداية باستعمال __new__ لإنشاء غرض جديد ثم يستدعي __init__ على هذا الغرض بالبارامترات التي قمنا بتمريرها. في غالب الأحيان لن تضطر إلى تعريف __new__ بنفسك، حيث أن استعمالها يعتبر متقدم نوعاً ما، بشكل عام أنت تريدها لضبط عملية صنع الأغراض، مثلا في حال كنت تريد تصميم صنف يتبع نمط التصميم singleton فإنه يمكن استعمالها لتقييد ألا يتم صنع أكثر من غرض واحد، بالشكل التالي: class SingletonClass(object): def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super(SingletonClass, cls).__new__(cls) return cls.instance بينما __init__ نقوم باستعمالها بشكل طبيعي مثل الباني، حيث أنها تقوم بتهيئة جميع البيانات التابعة للغرض المنشئ. تم التعديل في 11 سبتمبر 2022 بواسطة Kais Hasan 1 اقتباس
0 معاذ قره محمد نشر 11 سبتمبر 2022 أرسل تقرير نشر 11 سبتمبر 2022 __new__ هي أول خطوة يتم تنفيذها عند إنشاء غرض من هذا الصف وهي المسؤولة عن إرجاع غرض جديد من هذا الصف. __init__ هذه الدالة لا تعيد شيء، فقط تقوم بإسناد الخواص لهذا الكائن الذي سبق إنشاءه من الدالة __new__ أي أنّ __new__ تتنفذ أولاً وتعيد غرضاً جديداً من الصف، ثم تتنفّذ __init__ وتعرف خواص هذا الصف. وتكون new مسؤولة عن إنشاء الغرض من الصف، والinit عن تعريف صفات الغرض فمثلا الكود التالي: class A: def __new__(inctance, name): print("new") # A هنا هو inctanceنوع ال return object.__new__(inctance) # A إرجاع غرض جديد من الصف def __init__(self, name): self.name = name # تعريف خواص الغرض الجديد الناتج print("created with name: " + self.name) a = A("ahmed") سيكون خرجه: new created with name: ahmed والسبب كما ذكرت لك آنفا أن new تنفذ أولا ثم init فنفّذ أولا تعليمة الطباعة في new ثم في init اقتباس
السؤال
Ali Ali38
لقد تعلمت أنه يوجد طريقتين في الأصناف هما __new__ و __init__ لكن لم أفهم الفرق بينهما و متى يتم استعمال كل منهما؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.