পাইথন অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP): ক্লাস এবং অবজেক্ট

ভূমিকা পাইথন শেখার জার্নিতে আমরা এখন একটা বড় ধাপে এসে পড়েছি—অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP)! এটা প্রোগ্রামিংয়ের একটা শক্তিশালী পদ্ধতি যেটা কোডকে আরও সংগঠিত এবং বাস্তব জগতের মতো করে তোলে। এই পোস্টে আপনি শিখবেন: OOP কী এবং ক্লাস-অবজেক্ট কীভাবে কাজ করে। ক্লাস তৈরি, অ্যাট্রিবিউট এবং মেথড ব্যবহার। self কীওয়ার্ডের গুরুত্ব। ইনহেরিটেন্স (উত্তরাধিকার) এর সহজ ধারণা। একটা লাইব্রেরি সিস্টেম প্রজেক্ট। OOP শিখলে আপনার কোড আরও স্মার্ট এবং পুনরায় ব্যবহারযোগ্য হবে। চলুন শুরু করি! OOP কী এবং কেন দরকার? OOP-এর মূল ধারণা OOP হলো এমন একটা প্রোগ্রামিং স্টাইল যেখানে আমরা বাস্তব জগতের জিনিসগুলোকে “অবজেক্ট” হিসেবে ভাবি। ধরুন, একটা গাড়ি। এর রঙ, মডেল, গতি হলো বৈশিষ্ট্য (attributes), আর এটা চালানো, থামানো হলো কাজ (methods)। OOP-এ আমরা এভাবে কোড সাজাই। মূল উদ্দেশ্য: সংগঠন: কোডকে ছোট ছোট অংশে ভাগ করা। পুনঃব্যবহার: একবার লিখে বারবার ব্যবহার। বাস্তবতা: জিনিসগুলোকে বাস্তবের মতো মডেল করা। ক্লাস এবং অবজেক্ট ক্লাস: একটা ব্লুপ্রিন্ট বা ছাঁচ। যেমন, “গাড়ি” ক্লাস বলে গাড়ির সাধারণ বৈশিষ্ট্য। অবজেক্ট: ক্লাস থেকে তৈরি করা আসল জিনিস। যেমন, “লাল টয়োটা গাড়ি” একটা অবজেক্ট। উদাহরণ: class Car: def drive(self): print("গাড়ি চলছে!") my_car = Car() # অবজেক্ট তৈরি my_car.drive() # আউটপুট: গাড়ি চলছে! ক্লাস তৈরি এবং ব্যবহার ক্লাস ডিফাইন করা class কীওয়ার্ড দিয়ে ক্লাস তৈরি হয়। এর ভেতর অ্যাট্রিবিউট (তথ্য) এবং মেথড (কাজ) থাকে। উদাহরণ: class Dog: def __init__(self, name, age): self.name = name # অ্যাট্রিবিউট self.age = age def bark(self): # মেথড print(f"{self.name} ডাকছে: ভৌ ভৌ!") __init__: ক্লাসের কনস্ট্রাক্টর, অবজেক্ট তৈরির সময় চলে। self: অবজেক্ট নিজেকে বোঝায়। অবজেক্ট তৈরি dog1 = Dog("ম্যাক্স", 3) print(dog1.name) # আউটপুট: ম্যাক্স dog1.bark() # আউটপুট: ম্যাক্স ডাকছে: ভৌ ভৌ! ব্যাখ্যা: dog1 হলো Dog ক্লাসের একটা অবজেক্ট। name এবং age হলো অ্যাট্রিবিউট। bark() হলো মেথড। self কীওয়ার্ড বোঝা self হলো একটা বিশেষ শব্দ যেটা ক্লাসের ভেতরে অবজেক্ট নিজেকে বোঝায়। এটা ব্যবহার না করলে ক্লাস জানবে না কোন অবজেক্টের তথ্য বা কাজ বোঝানো হচ্ছে। উদাহরণ: class Person: def __init__(self, name): self.name = name # self ছাড়া name কাজ করবে না def say_hello(self): print(f"হ্যালো, আমি {self.name}!") person1 = Person("রাহিম") person2 = Person("রিয়া") person1.say_hello() # আউটপুট: হ্যালো, আমি রাহিম! person2.say_hello() # আউটপুট: হ্যালো, আমি রিয়া! self.name দিয়ে প্রতিটা অবজেক্টের নিজস্ব নাম আলাদা রাখা হয়। থিওরি: self না থাকলে সব অবজেক্ট একই তথ্য শেয়ার করত, যেটা OOP-এর লক্ষ্য নয়। এটা অবজেক্টের আইডেন্টিটি বজায় রাখে। ইনহেরিটেন্স (উত্তরাধিকার) ইনহেরিটেন্স মানে একটা ক্লাসের বৈশিষ্ট্য আরেকটা ক্লাসে পাওয়া। যেমন, “পশু” ক্লাস থেকে “কুকুর” ক্লাস তৈরি। কীভাবে কাজ করে? class Animal: def __init__(self, species): self.species = species def make_sound(self): print("কিছু শব্দ!") class Cat(Animal): # Animal থেকে ইনহেরিট def __init__(self, name): super().__init__("বিড়াল") # প্যারেন্ট ক্লাসের __init__ কল self.name = name def make_sound(self): # ওভাররাইড print(f"{self.name} বলছে: মিউ মিউ!") cat1 = Cat("মিনি") print(cat1.species) # আউটপুট: বিড়াল cat1.make_sound() # আউটপুট: মিনি বলছে: মিউ মিউ! Cat(Animal): Animal-এর সবকিছু পায়। super(): প্যারেন্ট ক্লাসের মেথড কল করে। make_sound(): প্যারেন্টের মেথড ওভাররাইড করে। থিওরি: ইনহেরিটেন্স কোড পুনঃব্যবহার বাড়ায় এবং সাধারণ বৈশিষ্ট্য শেয়ার করতে দেয়। প্রজেক্ট: লাইব্রেরি সিস্টেম চলুন একটা লাইব্রেরি সিস্টেম বানাই যেখানে বই এবং ইউজার থাকবে। ধাপগুলো: নতুন ফাইল বানান, নাম দিন library.py। এই কোড লিখুন: class Book: def __init__(self, title, author): self.title = title self.author = author self.is_available = True def borrow(self): if self.is_available: self.is_available = False print(f"{self.title} ধার নেওয়া হয়েছে।") else: print(f"{self.title} পাওয়া যাচ্ছে না।") def return_book(self): self.is_available = True print(f"{self.title} ফেরত দেওয়া হয়েছে।") class User: def __init__(self, name): self.name = name self.borrowed_books = [] def borrow_book(self, book): if book.is_available: book.borrow() self.borrowed_books.append(book) else: print(f"{self.name} বইটি ধার নিতে পারেনি।") def return_book(self, book): if book in self.borrowed_books: book.return_book() self.borrowed_books.remove(book) else: print(f"{self.name} এই বই ধার নেয়নি।") # টেস্ট করা book1 = Book("পাইথন শেখা", "জন ডো") user1 = User("রাহিম") user1.borrow_book(book1) user1.borrow_book(book1) # দ্বিতীয়বার চেষ্টা user1.return_book(book1) টার্মিনালে চা

Mar 22, 2025 - 06:21
 0
পাইথন অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP): ক্লাস এবং অবজেক্ট

ভূমিকা

পাইথন শেখার জার্নিতে আমরা এখন একটা বড় ধাপে এসে পড়েছি—অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP)! এটা প্রোগ্রামিংয়ের একটা শক্তিশালী পদ্ধতি যেটা কোডকে আরও সংগঠিত এবং বাস্তব জগতের মতো করে তোলে। এই পোস্টে আপনি শিখবেন:

  • OOP কী এবং ক্লাস-অবজেক্ট কীভাবে কাজ করে।
  • ক্লাস তৈরি, অ্যাট্রিবিউট এবং মেথড ব্যবহার।
  • self কীওয়ার্ডের গুরুত্ব।
  • ইনহেরিটেন্স (উত্তরাধিকার) এর সহজ ধারণা।
  • একটা লাইব্রেরি সিস্টেম প্রজেক্ট।

OOP শিখলে আপনার কোড আরও স্মার্ট এবং পুনরায় ব্যবহারযোগ্য হবে। চলুন শুরু করি!

OOP কী এবং কেন দরকার?

OOP-এর মূল ধারণা

OOP হলো এমন একটা প্রোগ্রামিং স্টাইল যেখানে আমরা বাস্তব জগতের জিনিসগুলোকে “অবজেক্ট” হিসেবে ভাবি। ধরুন, একটা গাড়ি। এর রঙ, মডেল, গতি হলো বৈশিষ্ট্য (attributes), আর এটা চালানো, থামানো হলো কাজ (methods)। OOP-এ আমরা এভাবে কোড সাজাই।

মূল উদ্দেশ্য:

  • সংগঠন: কোডকে ছোট ছোট অংশে ভাগ করা।
  • পুনঃব্যবহার: একবার লিখে বারবার ব্যবহার।
  • বাস্তবতা: জিনিসগুলোকে বাস্তবের মতো মডেল করা।

ক্লাস এবং অবজেক্ট

  • ক্লাস: একটা ব্লুপ্রিন্ট বা ছাঁচ। যেমন, “গাড়ি” ক্লাস বলে গাড়ির সাধারণ বৈশিষ্ট্য।
  • অবজেক্ট: ক্লাস থেকে তৈরি করা আসল জিনিস। যেমন, “লাল টয়োটা গাড়ি” একটা অবজেক্ট।

উদাহরণ:

class Car:
    def drive(self):
        print("গাড়ি চলছে!")

my_car = Car()  # অবজেক্ট তৈরি
my_car.drive()  # আউটপুট: গাড়ি চলছে!

ক্লাস তৈরি এবং ব্যবহার

ক্লাস ডিফাইন করা

class কীওয়ার্ড দিয়ে ক্লাস তৈরি হয়। এর ভেতর অ্যাট্রিবিউট (তথ্য) এবং মেথড (কাজ) থাকে। উদাহরণ:

class Dog:
    def __init__(self, name, age):
        self.name = name  # অ্যাট্রিবিউট
        self.age = age

    def bark(self):  # মেথড
        print(f"{self.name} ডাকছে: ভৌ ভৌ!")
  • __init__: ক্লাসের কনস্ট্রাক্টর, অবজেক্ট তৈরির সময় চলে।
  • self: অবজেক্ট নিজেকে বোঝায়।

অবজেক্ট তৈরি

dog1 = Dog("ম্যাক্স", 3)
print(dog1.name)  # আউটপুট: ম্যাক্স
dog1.bark()       # আউটপুট: ম্যাক্স ডাকছে: ভৌ ভৌ!

ব্যাখ্যা:

  • dog1 হলো Dog ক্লাসের একটা অবজেক্ট।
  • name এবং age হলো অ্যাট্রিবিউট।
  • bark() হলো মেথড।

self কীওয়ার্ড বোঝা

self হলো একটা বিশেষ শব্দ যেটা ক্লাসের ভেতরে অবজেক্ট নিজেকে বোঝায়। এটা ব্যবহার না করলে ক্লাস জানবে না কোন অবজেক্টের তথ্য বা কাজ বোঝানো হচ্ছে।

উদাহরণ:

class Person:
    def __init__(self, name):
        self.name = name  # self ছাড়া name কাজ করবে না

    def say_hello(self):
        print(f"হ্যালো, আমি {self.name}!")

person1 = Person("রাহিম")
person2 = Person("রিয়া")
person1.say_hello()  # আউটপুট: হ্যালো, আমি রাহিম!
person2.say_hello()  # আউটপুট: হ্যালো, আমি রিয়া!
  • self.name দিয়ে প্রতিটা অবজেক্টের নিজস্ব নাম আলাদা রাখা হয়।

থিওরি: self না থাকলে সব অবজেক্ট একই তথ্য শেয়ার করত, যেটা OOP-এর লক্ষ্য নয়। এটা অবজেক্টের আইডেন্টিটি বজায় রাখে।

ইনহেরিটেন্স (উত্তরাধিকার)

ইনহেরিটেন্স মানে একটা ক্লাসের বৈশিষ্ট্য আরেকটা ক্লাসে পাওয়া। যেমন, “পশু” ক্লাস থেকে “কুকুর” ক্লাস তৈরি।

কীভাবে কাজ করে?

class Animal:
    def __init__(self, species):
        self.species = species

    def make_sound(self):
        print("কিছু শব্দ!")

class Cat(Animal):  # Animal থেকে ইনহেরিট
    def __init__(self, name):
        super().__init__("বিড়াল")  # প্যারেন্ট ক্লাসের __init__ কল
        self.name = name

    def make_sound(self):  # ওভাররাইড
        print(f"{self.name} বলছে: মিউ মিউ!")

cat1 = Cat("মিনি")
print(cat1.species)  # আউটপুট: বিড়াল
cat1.make_sound()   # আউটপুট: মিনি বলছে: মিউ মিউ!
  • Cat(Animal): Animal-এর সবকিছু পায়।
  • super(): প্যারেন্ট ক্লাসের মেথড কল করে।
  • make_sound(): প্যারেন্টের মেথড ওভাররাইড করে।

থিওরি: ইনহেরিটেন্স কোড পুনঃব্যবহার বাড়ায় এবং সাধারণ বৈশিষ্ট্য শেয়ার করতে দেয়।

প্রজেক্ট: লাইব্রেরি সিস্টেম

চলুন একটা লাইব্রেরি সিস্টেম বানাই যেখানে বই এবং ইউজার থাকবে।

ধাপগুলো:

  1. নতুন ফাইল বানান, নাম দিন library.py
  2. এই কোড লিখুন:
   class Book:
       def __init__(self, title, author):
           self.title = title
           self.author = author
           self.is_available = True

       def borrow(self):
           if self.is_available:
               self.is_available = False
               print(f"{self.title} ধার নেওয়া হয়েছে।")
           else:
               print(f"{self.title} পাওয়া যাচ্ছে না।")

       def return_book(self):
           self.is_available = True
           print(f"{self.title} ফেরত দেওয়া হয়েছে।")

   class User:
       def __init__(self, name):
           self.name = name
           self.borrowed_books = []

       def borrow_book(self, book):
           if book.is_available:
               book.borrow()
               self.borrowed_books.append(book)
           else:
               print(f"{self.name} বইটি ধার নিতে পারেনি।")

       def return_book(self, book):
           if book in self.borrowed_books:
               book.return_book()
               self.borrowed_books.remove(book)
           else:
               print(f"{self.name} এই বই ধার নেয়নি।")

   # টেস্ট করা
   book1 = Book("পাইথন শেখা", "জন ডো")
   user1 = User("রাহিম")
   user1.borrow_book(book1)
   user1.borrow_book(book1)  # দ্বিতীয়বার চেষ্টা
   user1.return_book(book1)
  1. টার্মিনালে চালান:
   python library.py
  1. আউটপুট দেখুন:
   পাইথন শেখা ধার নেওয়া হয়েছে।
   পাইথন শেখা পাওয়া যাচ্ছে না।
   পাইথন শেখা ফেরত দেওয়া হয়েছে।

কোড ব্যাখ্যা:

  • Book: বইয়ের তথ্য এবং ধার-ফেরত মেথড।
  • User: ইউজারের তথ্য এবং বই ধার করার ক্ষমতা।
  • is_available: বই পাওয়া যায় কি না চেক করে।

হোমওয়ার্ক: ব্যাঙ্ক অ্যাকাউন্ট সিমুলেশন

আপনার কাজ হলো একটা ব্যাঙ্ক অ্যাকাউন্ট প্রোগ্রাম বানানো যেখানে ডিপোজিট এবং উত্তোলন করা যাবে।

ধাপগুলো:

  1. ফাইল বানান, নাম দিন bank_account.py
  2. এই কোড লিখুন:
   class BankAccount:
       def __init__(self, owner, balance=0):
           self.owner = owner
           self.balance = balance

       def deposit(self, amount):
           if amount > 0:
               self.balance += amount
               print(f"{amount} টাকা জমা হয়েছে। ব্যালেন্স: {self.balance}")
           else:
               print("জমার পরিমাণ ধনাত্মক হতে হবে!")

       def withdraw(self, amount):
           if amount > self.balance:
               print("পর্যাপ্ত টাকা নেই!")
           elif amount <= 0:
               print("উত্তোলনের পরিমাণ ধনাত্মক হতে হবে!")
           else:
               self.balance -= amount
               print(f"{amount} টাকা উত্তোলন করা হয়েছে। ব্যালেন্স: {self.balance}")

   # টেস্ট করা
   account = BankAccount("রিয়া", 1000)
   account.deposit(500)
   account.withdraw(200)
   account.withdraw(2000)
  1. চালান:
   python bank_account.py
  1. আউটপুট:
   500 টাকা জমা হয়েছে। ব্যালেন্স: 1500
   200 টাকা উত্তোলন করা হয়েছে। ব্যালেন্স: 1300
   পর্যাপ্ত টাকা নেই!

কোড ব্যাখ্যা:

  • BankAccount: অ্যাকাউন্টের তথ্য রাখে।
  • deposit(): টাকা জমা করে।
  • withdraw(): টাকা তুলে, ব্যালেন্স চেক করে।

উপসংহার

আজ আমরা শিখলাম:

  • OOP কী এবং ক্লাস-অবজেক্টের ধারণা।
  • ক্লাসে অ্যাট্রিবিউট এবং মেথড তৈরি।
  • self-এর গুরুত্ব।
  • ইনহেরিটেন্সের সহজ উদাহরণ।
  • লাইব্রেরি সিস্টেম প্রোগ্রাম।

OOP শিখে আপনি এখন বড় প্রোগ্রাম সংগঠিতভাবে লিখতে পারবেন। প্রজেক্ট আর হোমওয়ার্ক চেষ্টা করুন। কমেন্টে বলুন কেমন লাগলো বা কোথায় সমস্যা হয়েছে।

প্রশ্ন:

  1. OOP বোঝা কি সহজ লেগেছে?
  2. self ব্যবহার কি আপনার কাছে পরিষ্কার?
  3. লাইব্রেরি সিস্টেমে কি কিছু যোগ করতে চান?