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