Python for AI/Object-Oriented Programming/Lesson 22
Classes ও Objects
Data আর তার সাথে সম্পর্কিত কাজ এক জায়গায় — class হলো নকশা, object হলো সেই নকশায় বানানো জিনিস। __init__, self, method, আর কেন PyTorch-এর প্রতিটা model একটা class।
- সময়
- 24 মিনিট
- Exercise
- 1
- Challenge
- 1
- Quiz
- 3 প্রশ্ন
সহজ ভাষায়
এখন পর্যন্ত data (variable) আর কাজ (function) আলাদা আলাদা রেখেছি। একজন student-এর তথ্য রাখতে dictionary, আর তার ওপর কাজ করতে আলাদা function:
Class দিয়ে data আর তার কাজ একসাথে বাঁধা যায়:
- Class (
Student) — নকশা। "একজন student-এর একটা নাম আর CGPA থাকে, আর সে honors কিনা বলা যায়।" - Object (
rafi,mim) — নকশা থেকে বানানো আসল জিনিস। প্রতিটার নিজের data।
class Student (নকশা)
+----------------------+
| name, cgpa |
| is_honors() |
+----------------------+
/ \
rafi (object) mim (object)
name="Rafi" name="Mim"
cgpa=3.6 cgpa=3.2
কেন দরকার?
তুমি যে ML library-ই ব্যবহার করো, সবখানে class আর object:
model = LinearRegression() <- একটা object বানালাম
model.fit(X_train, y_train) <- object-এর method
model.coef_ <- object-এর attribute (শেখা মান)
আর PyTorch-এ নিজের model বানাতে হয় class লিখে:
class MyModel(nn.Module):
def __init__(self):
...
def forward(self, x):
...
OOP না বুঝলে এই code পড়া আর লেখা — দুটোই কঠিন।
__init__ আর self
__init__— constructor।Laptop(...)লিখলেই নতুন object তৈরি হয় আর__init__চলে।self— যে object-টা এইমাত্র তৈরি হচ্ছে, সেটাই।self.brand = brandমানে "এই object-এর brand হবে এই মান"।self.brandহলো attribute — object-এর ভেতরের variable।
Method
Class-এর ভেতরের function-কে বলে method। প্রথম parameter সবসময় self:
old.upgrade_ram(8) লিখলে Python আসলে ডাকে Laptop.upgrade_ram(old, 8) — তাই self হয় old। এজন্যই method ডাকার সময় self নিজে দিতে হয় না।
প্রতিটা object স্বাধীন
একই class, কিন্তু a আর b-এর আলাদা count।
self ভুলে গেলে
খুব common ভুল — method-এ self লিখতে ভুলে যাওয়া:
TypeError: Dog.bark() takes 0 positional arguments but 1 was given — Python d-কে প্রথম argument হিসেবে পাঠিয়েছে, কিন্তু method কোনো parameter নেয় না। সমাধান: def bark(self):।
Exercise
Exercise
Student class
Student class বানাও:
__init__নেবেnameআরcgpa, এবং দুটোই object-এ রাখবেis_honors()method — cgpa 3.5 বা বেশি হলেTrue, নাহলেFalseintroduce()method — return করবে"আমি Rafi, CGPA 3.6"আকারের string
Quiz
Challenge
Challenge
BankAccount
BankAccount class বানাও:
BankAccount(owner)— শুরুতেbalanceহবে0, আরhistoryএকটা খালি listdeposit(amount)— balance বাড়াবে,history-তে("deposit", amount)যোগ করবেwithdraw(amount)— যথেষ্ট টাকা থাকলে balance কমাবে,history-তে("withdraw", amount)যোগ করবে আরTruereturn করবে; না থাকলে কিছুই বদলাবে না,Falsereturn করবে
প্রতিটা account-এর নিজের আলাদা balance আর history থাকবে।
বাস্তবে কোথায় ব্যবহার হয়?
scikit-learn-এর প্রতিটা model একই আকারের class — fit() দিয়ে শেখে, শেখা মান attribute-এ রাখে, predict() দিয়ে ব্যবহার করে। চলো সবচেয়ে সহজ একটা "model" বানাই — যেটা সবসময় training data-র গড় predict করে:
এটা বোকা model, কিন্তু এর আকার হুবহু scikit-learn-এর LinearRegression-এর মতো। Real ML-এ একে বলে baseline — তোমার আসল model-কে অন্তত এটাকে হারাতে হবে। আর mean_-এর শেষে _ — scikit-learn-এর convention: "fit করার পর শেখা মান"।
Interview প্রশ্ন
- Beginner: Class আর object-এর পার্থক্য কী?
selfকী? - Intermediate: Dictionary + function দিয়ে যা করা যায়, class দিয়ে করার সুবিধা কী?
- Advanced: scikit-learn-এ
fit()কেনselfreturn করে? (Method chaining:Model().fit(X, y).predict(X_new)।)
এরপর কী?
আমরা object-এর attribute দেখলাম। কিন্তু এমন data-ও আছে যা সব object শেয়ার করে, আর এমন method যা object ছাড়াই ডাকা যায়। পরের lesson: Methods ও Attributes — class attribute, @property, @classmethod, @staticmethod।