বেশিরভাগ সুপরিচিত ওও ভাষাগুলিতে, মত একটি এক্সপ্রেশন SomeClass(arg1, arg2)
একটি নতুন উদাহরণ বরাদ্দ করবে, উদাহরণের বৈশিষ্ট্যগুলি আরম্ভ করবে এবং তারপরে এটি ফিরিয়ে দেবে।
সবচেয়ে সুপরিচিত OO যেমন পণ্য ভাষায়, "উদাহরণস্বরূপ গুণাবলী ইনিশিয়ালাইজ" অংশ সংজ্ঞা দ্বারা প্রতিটি বর্গ জন্য কাস্টমাইজ করা যায় কন্সট্রাকটর , যা মূলত শুধু একটি কোড ব্লক যে (নতুন উদাহরণ করে পরিচালিত কন্সট্রাকটর এক্সপ্রেশন প্রদত্ত যুক্তিগুলির ব্যবহার করছে ) প্রারম্ভিক শর্তগুলি যা পছন্দসই সেট আপ করতে। পাইথনে এটি ক্লাসের সাথে __init__
মেলে।
পাইথন এর __new__
চেয়ে বেশি কিছুই নয় এবং "নতুন উদাহরণ বরাদ্দ করুন" অংশটির প্রতি-শ্রেণীর কাস্টমাইজেশনের তুলনায় কম কিছুই নয়। এটি অবশ্যই আপনাকে কোনও নতুন বরাদ্দ দেওয়ার পরিবর্তে কোনও বিদ্যমান উদাহরণ ফিরিয়ে দেওয়ার মতো অস্বাভাবিক জিনিসগুলি করার অনুমতি দেয়। পাইথনে তাই, আমাদের অবশ্যই এই অংশটি প্রয়োজনীয়ভাবে বরাদ্দ জড়িত হিসাবে ভাবা উচিত নয়; আমাদের যা প্রয়োজন তা হ'ল __new__
কোথাও থেকে উপযুক্ত উদাহরণ সহ।
তবে এটি এখনও কাজের অর্ধেক অংশ, এবং পাইথন সিস্টেমের পক্ষে এটি জানার উপায় নেই যে কখনও কখনও আপনি কাজটির অর্ধেক চালাতে চান ( __init__
) পরে এবং কখনও কখনও আপনি করেন না। যদি আপনি সেই আচরণটি চান, আপনাকে তাই স্পষ্ট করে বলতে হবে।
প্রায়শই, আপনি কেবল চুল্লি করতে পারেন যাতে আপনার কেবল প্রয়োজন হয় __new__
, বা আপনার প্রয়োজন হয় না __new__
, বা __init__
এটি ইতিমধ্যে-আরম্ভকৃত কোনও বস্তুর উপর অন্যরকম আচরণ করে। তবে আপনি যদি সত্যিই চান, পাইথন আপনাকে "কাজ" নতুন করে সংজ্ঞায়িত করার অনুমতি দেয়, যাতে এটি SomeClass(arg1, arg2)
প্রয়োজনীয়ভাবে __new__
অনুসরণ করে কল না করে __init__
। এটি করার জন্য, আপনাকে একটি মেটাক্লাস তৈরি করতে হবে এবং এর __call__
পদ্ধতিটি নির্ধারণ করতে হবে ।
একটি মেটাক্লাস কেবল একটি শ্রেণীর শ্রেণি। এবং ক্লাসের একটি __call__
পদ্ধতি যখন আপনি শ্রেণীর উদাহরণগুলি কল করেন তখন কী ঘটে তা নিয়ন্ত্রণ করে। সুতরাং একটি মেটাগ্লাস ' __call__
পদ্ধতিটি আপনি যখন ক্লাস কল করেন তখন কী হয় তা নিয়ন্ত্রণ করে; অর্থাত্ এটি আপনাকে প্রথম থেকে শেষ পর্যন্ত ইনস্ট্যান্স-তৈরির প্রক্রিয়াটি পুনরায় সংজ্ঞায়িত করতে সহায়তা করে । এটি এমন একটি স্তর যেখানে আপনি সর্বাধিক মার্জিতভাবে সিঙ্গেলটন প্যাটার্নের মতো সম্পূর্ণ অ-মানক উদাহরণ নির্মাণ প্রক্রিয়াটি প্রয়োগ করতে পারেন। বস্তুত, কোডের কম 10 লাইনের আপনি যদি একটি বাস্তবায়ন করতে পারে Singleton
ক্লাসের অধীনে একটি ক্লাস যে তারপর এমনকি আপনি সঙ্গে futz করার প্রয়োজন হয় না __new__
এ সব , আর চালু করতে পারেন কোনো একটি Singleton মধ্যে কেবল যোগ করে অন্যথায়-স্বাভাবিক বর্গ __metaclass__ = Singleton
!
class Singleton(type):
def __init__(self, *args, **kwargs):
super(Singleton, self).__init__(*args, **kwargs)
self.__instance = None
def __call__(self, *args, **kwargs):
if self.__instance is None:
self.__instance = super(Singleton, self).__call__(*args, **kwargs)
return self.__instance
তবে এটি সম্ভবত এই পরিস্থিতিটির সত্যতা চেয়ে বেশি গভীর যাদু!