আমি যে প্রশ্নটি জিজ্ঞাসা করতে চাইছি তা পাইথন দ্বারা __ নতুন__ এবং __init__ ব্যবহারের সদৃশ ? কিন্তু নির্বিশেষে, এটা এখনও স্পষ্ট নয় আমার কাছে ঠিক কি মধ্যে ব্যবহারিক পার্থক্য __new__এবং __init__হয়।
আপনি আমাকে তাড়াহুড়া করার আগে যে __new__জিনিসগুলি তৈরির জন্য এবং __init__অবজেক্টগুলি আরম্ভ করার জন্য তাড়ানোর আগে, আমাকে পরিষ্কার করে দিন: আমি এটি পেয়েছি। আসলে, এই পার্থক্যটি আমার কাছে একেবারেই স্বাভাবিক, যেহেতু আমার সি ++ তে অভিজ্ঞতা আছে যেখানে আমাদের নতুন প্লেসমেন্ট রয়েছে , যা একইভাবে অবজেক্টের বরাদ্দকে আরম্ভকরণ থেকে পৃথক করে।
পাইথন সি এপিআই টিউটোরিয়াল এর মতো এটিকে ব্যাখ্যা করেছেন:
নতুন সদস্য এই ধরণের অবজেক্ট তৈরি করার জন্য (দায়বদ্ধ হওয়ার বিপরীতে) দায়বদ্ধ। এটি পাইথনের
__new__()পদ্ধতি হিসাবে উদ্ভাসিত । ... একটি নতুন পদ্ধতি বাস্তবায়নের একটি কারণ হ'ল উদাহরণ ভেরিয়েবলের প্রাথমিক মানগুলি নিশ্চিত করা ।
সুতরাং, হাঁ - আমি পেতে কি __new__না, কিন্তু এই সত্ত্বেও, আমি এখনো বুঝতে পারছি না কেন এটা পাইথন দরকারী নয়। প্রদত্ত উদাহরণটি বলে যে __new__আপনি যদি "উদাহরণের ভেরিয়েবলের প্রাথমিক মানগুলি নিশ্চিত করতে চান" তা কার্যকর হতে পারে says ঠিক আছে, ঠিক তাই __init__করবে না?
সিপিআই টিউটোরিয়ালে, একটি উদাহরণ দেখানো হয় যেখানে একটি নতুন প্রকার ("নড্ডি" নামে পরিচিত) তৈরি হয়, এবং প্রকারটির __new__কার্যকারিতা সংজ্ঞায়িত হয়। নোডি টাইপের মধ্যে একটি স্ট্রিং সদস্য রয়েছে যার নাম রয়েছে firstএবং এই স্ট্রিং সদস্যকে খালি স্ট্রিংয়ের মতো করে আরম্ভ করা হয়:
static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
.....
self->first = PyString_FromString("");
if (self->first == NULL)
{
Py_DECREF(self);
return NULL;
}
.....
}
নোট করুন যে __new__এখানে বর্ণিত পদ্ধতি ব্যতীত আমাদের ব্যবহার করতে হবে PyType_GenericNew, যা কেবল সমস্ত পরিবর্তনশীল সদস্যকে NUL তে সূচনা করে to সুতরাং __new__পদ্ধতির একমাত্র সুবিধা হ'ল উদাহরণটি ভেরিয়েবলটি NUL এর বিপরীতে খালি স্ট্রিং হিসাবে শুরু হবে। তবে কেন এটি সর্বদা কার্যকর, যেহেতু আমরা যদি আমাদের দৃষ্টান্তের ভেরিয়েবলগুলি কিছু ডিফল্ট মান দিয়ে শুরু করি তা নিশ্চিত করার বিষয়ে যত্নশীল হন, তবে আমরা কেবল __init__পদ্ধতিতে এটি করতে পারতাম ?
__new__তা বোয়লারপ্লেট নয়, কারণ বয়লারপ্লেট কখনও পরিবর্তন হয় না। কখনও কখনও আপনাকে সেই নির্দিষ্ট কোডটি আলাদা কিছু দিয়ে প্রতিস্থাপন করতে হবে।