اذهب إلى المحتوى

السؤال

Recommended Posts

  • 1
نشر (معدل)

إن الطريقة __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__ نقوم باستعمالها بشكل طبيعي مثل الباني، حيث أنها تقوم بتهيئة جميع البيانات التابعة للغرض المنشئ.

تم التعديل في بواسطة Kais Hasan
  • 0
نشر

__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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...