ক্লাস এবং ওওপি (Classes & OOP)
ক্লাস কী? (What Are Classes?)
ক্লাস হলো একটি কুকি কাটারের (Cookie Cutter) মতো। কুকি কাটার নিজে কখনো কোনো কুকি বা বিস্কুট নয় — এটি কুকি তৈরি করার জন্য একটি টেমপ্লেট (ছাঁচ)। আপনি এই ছাঁচ দিয়ে যে নতুন কুকিগুলো তৈরি করবেন তার প্রতিটি হলো একেকটি অবজেক্ট (object) (যাকে ইনস্ট্যান্স বা instance-ও বলা হয়)। প্রতিটি কুকির আকার একই, তবে আপনি সেগুলোকে আলাদাভাবে সাজাতে পারেন (আলাদা আলাদা অ্যাট্রিবিউট ব্যবহার করে)।
প্রোগ্রামিংয়ের ভাষায়:
- ক্লাস (Class) = একটি ব্লুপ্রিন্ট বা নকশা (কোনো কিছুর কী ডেটা এবং আচরণ থাকবে তা ঠিক করে দেয়)
- অবজেক্ট/ইনস্ট্যান্স (Object/Instance) = সেই নকশা থেকে তৈরি একটি নির্দিষ্ট জিনিস
- অ্যাট্রিবিউট (Attributes) = অবজেক্টে সংরক্ষণ করে রাখা ডেটা (যেমন
name,age) - মেথড (Methods) = অবজেক্টের নিজস্ব ফাংশন (যেমন
speak(),jump())
আপনার প্রথম ক্লাস (Your First Class)
self প্যারামিটার (The self Parameter)
ক্লাসের প্রতিটি মেথড self-কে তার প্রথম প্যারামিটার হিসেবে গ্রহণ করে। self-কে একটি আয়নার (mirror) মতো চিন্তা করুন — এটি অবজেক্টকে নিজেকে নিজে রেফার (refer) করার সুযোগ করে দেয়। যখন আপনি buddy.bark() কল করেন, তখন পাইথন গোপনে self হিসেবে buddy-কে পাস করে, যার ফলে মেথডটি বুঝতে পারে যে কোন কুকুরটি ঘেউ ঘেউ করছে।
__init__ মেথডটি হলো একটি কনস্ট্রাক্টর (constructor) — যখনই আপনি একটি নতুন অবজেক্ট তৈরি করেন, তখন এটি স্বয়ংক্রিয়ভাবে রান করে। এটি হলো সেই জায়গা যেখানে আপনি অবজেক্টের শুরুর অবস্থাটি (starting state) সেটআপ করেন।
স্পেশাল (ডান্ডার) মেথডগুলো (Special (Dunder) Methods)
পাইথনে ডাবল আন্ডারস্কোর দিয়ে মোড়ানো বিশেষ মেথড ("ডান্ডার" বা dunder মেথড) আছে, যা আপনার অবজেক্টগুলোকে পাইথনের বিল্ট-ইন অপারেশন যেমন print(), len(), +, এবং বিভিন্ন তুলনামূলক কাজের সাথে ব্যবহার করার সুযোগ দেয়।
__str__—print()এবংstr()যা ব্যবহার করে। আপনার অবজেক্টকে মানুষের পড়ার উপযোগী করে তুলুন।__repr__— "ডেভেলপার" ভিউ। এটি আদর্শভাবে দেখানো উচিত যে কীভাবে অবজেক্টটিকে আবার তৈরি করা যায়।__len__—len(obj)-কে কাজ করতে দেয়।__eq__— আপনার অবজেক্টের জন্য==এর মানে কী, তা ঠিক করে।
ডান্ডার মেথডগুলোর ব্যবহার (Dunder Methods in Action)
ইনহেরিটেন্স — যা আছে তার ওপরেই তৈরি করুন (Inheritance — Building on What Exists)
ইনহেরিটেন্স বা উত্তরাধিকার আপনাকে বিদ্যমান একটি ক্লাসের ওপর ভিত্তি করে একটি নতুন ক্লাস তৈরি করার সুযোগ দেয়। নতুন ক্লাসটি (চাইল্ড বা সন্তান) বিদ্যমান ক্লাসটির (প্যারেন্ট বা পিতামাতা) সমস্ত অ্যাট্রিবিউট এবং মেথড পায়, এবং সেটিতে নতুন কোনো কিছু যোগ করতে বা আগেরগুলোকে ওভাররাইড করতে পারে।
এটিকে একটি ফ্যামিলি বিজনেস বা পারিবারিক ব্যবসার মতো চিন্তা করুন: সন্তান বাবা-মায়ের রেসিপি (মেথড) এবং তৈরির উপাদানগুলোর (অ্যাট্রিবিউট) উত্তরাধিকারী হয়, তবে তারা নিজেদের নতুন স্পেশালিটি বা বিশেষত্বও তৈরি করতে পারে।
ইনহেরিটেন্স এবং super() (Inheritance & super())
super().__init__() কল করতে ভুলে যাওয়া। এটি ছাড়া, প্যারেন্ট বা পিতামাতা ক্লাসের সেটআপ কোডটি রান করে না এবং আপনার অবজেক্টে বেশ কিছু অ্যাট্রিবিউট মিসিং থাকবে। আপনার চাইল্ডের __init__-এ সব সময় সবার আগে super() কল করুন!