মূল content-এ যাও

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:

main.py

Class দিয়ে data আর তার কাজ একসাথে বাঁধা যায়:

main.py
  • 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

main.py
  • __init__ — constructor। Laptop(...) লিখলেই নতুন object তৈরি হয় আর __init__ চলে।
  • self — যে object-টা এইমাত্র তৈরি হচ্ছে, সেটাই। self.brand = brand মানে "এই object-এর brand হবে এই মান"।
  • self.brand হলো attribute — object-এর ভেতরের variable।

Method

Class-এর ভেতরের function-কে বলে method। প্রথম parameter সবসময় self:

main.py

old.upgrade_ram(8) লিখলে Python আসলে ডাকে Laptop.upgrade_ram(old, 8) — তাই self হয় old। এজন্যই method ডাকার সময় self নিজে দিতে হয় না।

প্রতিটা object স্বাধীন

main.py

একই class, কিন্তু a আর b-এর আলাদা count।

self ভুলে গেলে

খুব common ভুল — method-এ self লিখতে ভুলে যাওয়া:

main.py

TypeError: Dog.bark() takes 0 positional arguments but 1 was given — Python d-কে প্রথম argument হিসেবে পাঠিয়েছে, কিন্তু method কোনো parameter নেয় না। সমাধান: def bark(self):।

Exercise

Exercise

Student class

+20 XP

Student class বানাও:

  • __init__ নেবে name আর cgpa, এবং দুটোই object-এ রাখবে
  • is_honors() method — cgpa 3.5 বা বেশি হলে True, নাহলে False
  • introduce() method — return করবে "আমি Rafi, CGPA 3.6" আকারের string
solution.py

Quiz

  1. Q1Class আর object-এর সম্পর্ক কোনটা?
  2. Q2Method-এর প্রথম parameter self কী?
  3. Q3__init__ কখন চলে?
0/3 answered

Challenge

Challenge

BankAccount

+50 XP

BankAccount class বানাও:

  • BankAccount(owner) — শুরুতে balance হবে 0, আর history একটা খালি list
  • deposit(amount) — balance বাড়াবে, history-তে ("deposit", amount) যোগ করবে
  • withdraw(amount) — যথেষ্ট টাকা থাকলে balance কমাবে, history-তে ("withdraw", amount) যোগ করবে আর True return করবে; না থাকলে কিছুই বদলাবে না, False return করবে

প্রতিটা account-এর নিজের আলাদা balance আর history থাকবে।

solution.py

বাস্তবে কোথায় ব্যবহার হয়?

scikit-learn-এর প্রতিটা model একই আকারের class — fit() দিয়ে শেখে, শেখা মান attribute-এ রাখে, predict() দিয়ে ব্যবহার করে। চলো সবচেয়ে সহজ একটা "model" বানাই — যেটা সবসময় training data-র গড় predict করে:

main.py

এটা বোকা 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() কেন self return করে? (Method chaining: Model().fit(X, y).predict(X_new)।)

এরপর কী?

আমরা object-এর attribute দেখলাম। কিন্তু এমন data-ও আছে যা সব object শেয়ার করে, আর এমন method যা object ছাড়াই ডাকা যায়। পরের lesson: Methods ও Attributes — class attribute, @property, @classmethod, @staticmethod।