Lesson 09 � OOP

OOP: CLASSES &
OBJECTS.

OOP se real-world entities ko code mein represent karte hain � Student, Car, BankAccount sab classes hain. Code reuse aur organization badhta hai. Classes ek blueprint hain, aur objects us blueprint se bante hain.

? 28 min✓ Intermediate✓ Prerequisite: Iterators

WHY: OOP kyun?

OOP (Object-Oriented Programming) ek programming paradigm hai jismein hum real-world entities ko code mein represent karte hain. Socho tum ek Student banana chahte ho � uska naam, course, marks. Har student ka data alag hai, but structure same hai. Yahi OOP ka kaam hai!

Analogy: Class ek blueprint hai (jaise ghar ka naksha), aur Object ek bana hua ghar hai. Naksha ek hota hai, ghar bahut ban sakte hain!

Core Concepts

CLASS

Blueprint jo objects banata hai. Ismein data (attributes) aur methods define hote hain.

OBJECT

Class ka instance � bana hua item. Har object ka apna data hota hai.

__init__

Constructor jo object banate waqt data set karta hai. Pehla method jo call hota hai.

SELF

Object khud ko refer karta hai. Har method mein pehla parameter hota hai.

Pehli Class Banate Hain

Chalo ek Student class banate hain jo student ka data store kare:

python
class Student:
 def __init__(self, name, age, course):
 self.name = name
 self.age = age
 self.course = course
 self.marks = []

 def add_mark(self, mark):
 self.marks.append(mark)

 def average(self):
 return sum(self.marks) / len(self.marks) if self.marks else 0

 def summary(self):
 return f"{self.name} ({self.course}) - Avg: {self.average():.1f}"

# Objects banao
aman = Student("Aman", 22, "Data Science")
aman.add_mark(85)
aman.add_mark(92)
print(aman.summary()) # Aman (Data Science) - Avg: 88.5

priya = Student("Priya", 21, "Python")
priya.add_mark(95)
priya.add_mark(88)
print(priya.summary()) # Priya (Python) - Avg: 91.5

Dekho � class Student: se ek blueprint bana. __init__ mein self.name = name ka matlab hai ki jab object banega, uska naam set ho jayega. self khud ko refer karta hai.

Code Ko Samajhte Hain

PartMeaning
class Student:Ek naya blueprint bana raha hai � Student naam ka
__init__(self, name, ...)Constructor � jab Student(...) call hoga, ye chalega
self.name = nameObject ka attribute set kar raha hai
self.marks = []Har student ka apna empty marks list hoga
def add_mark(self, mark)Method � object ke marks mein mark add karta hai
aman = Student("Aman", 22, "DS")Ek actual object bana � ab Aman exist karta hai!
Common Mistake: self ko bhoolna! Har method mein pehla parameter self hona chahiye, but jab method call karo toh self mat do � Python automatically pass karta hai.

Methods Add Karte Hain

Class mein methods (functions) se object apna kaam karta hai. Chalo Student class mein kuch aur methods add karte hain:

python
class Student:
 def __init__(self, name, age, course):
 self.name = name
 self.age = age
 self.course = course
 self.marks = []

 def add_mark(self, mark):
 self.marks.append(mark)

 def average(self):
 if not self.marks:
 return 0
 return sum(self.marks) / len(self.marks)

 def is_passing(self, passing_marks=40):
 return self.average() >= passing_marks

 def grade(self):
 avg = self.average()
 if avg >= 90: return "A+"
 elif avg >= 80: return "A"
 elif avg >= 70: return "B"
 elif avg >= 60: return "C"
 elif avg >= 50: return "D"
 else: return "F"

 def summary(self):
 return f"{self.name} ({self.course}) - Avg: {self.average():.1f} | Grade: {self.grade()}"


# Use karo
rahul = Student("Rahul", 23, "ML")
rahul.add_mark(92)
rahul.add_mark(88)
rahul.add_mark(95)
print(rahul.summary())
# Rahul (ML) - Avg: 91.7 | Grade: A+
print(rahul.is_passing()) # True

sara = Student("Sara", 20, "Web Dev")
sara.add_mark(35)
sara.add_mark(42)
print(sara.summary())
# Sara (Web Dev) - Avg: 38.5 | Grade: F
print(sara.is_passing()) # False

Dekho � har student ka marks list alag hai. Rahul ke marks [92, 88, 95], Sara ke [35, 42]. Yahi OOP ki power hai � data encapsulation.

Class vs Object

FeatureClassObject
Kya hai?Blueprint / TemplateInstance / Bana hua item
MemorySirf ek baar define hota haiHar object alag memory leta hai
DataAttributes define karta haiAttributes mein actual values hoti hain
Syntaxclass Student:s = Student("Aman", 22, "DS")
AnalogyGhar ka nakshaBana hua ghar

Real-World Example: BankAccount

Chalo ek aur real-world example dekhte hain � BankAccount class:

python
class BankAccount:
 def __init__(self, owner, balance=0):
 self.owner = owner
 self.balance = balance
 self.transactions = []

 def deposit(self, amount):
 if amount <= 0:
 return "Amount positive hona chahiye!"
 self.balance += amount
 self.transactions.append(("deposit", amount))
 return f"?{amount} deposited. Balance: ?{self.balance}"

 def withdraw(self, amount):
 if amount > self.balance:
 return "Insufficient balance!"
 if amount <= 0:
 return "Amount positive hona chahiye!"
 self.balance -= amount
 self.transactions.append(("withdraw", amount))
 return f"?{amount} withdrawn. Balance: ?{self.balance}"

 def get_balance(self):
 return self.balance

 def statement(self):
 if not self.transactions:
 return "No transactions yet."
 result = f"--- {self.owner}'s Statement ---\n"
 for t_type, amount in self.transactions:
 result += f"{t_type}: ?{amount}\n"
 result += f"Final Balance: ?{self.balance}"
 return result


# Accounts banao
rahul_acc = BankAccount("Rahul", 1000)
print(rahul_acc.deposit(500)) # ?500 deposited. Balance: ?1500
print(rahul_acc.withdraw(200)) # ?200 withdrawn. Balance: ?1300
print(rahul_acc.statement())

Try it: code ko run karo

Python playgroundFirst run download kar sakta hai
Run Python dabayein

Tips & Tricks

Pro Tip: __str__ method define karo � jab print(obj) karoge toh achha output milega bina kisi extra method ke!
python
class Student:
 def __init__(self, name, course):
 self.name = name
 self.course = course

 def __str__(self):
 return f"Student({self.name}, {self.course})"

s = Student("Aman", "DS")
print(s) # Student(Aman, DS) � direct print!

Quick check

Python mein object banane ke liye pehle kya define karna padta hai?

Object ek blueprint se banta hai � uss blueprint ka naam Python mein class keyword se hota hai.

Common mistakes

python � Galat vs Sahi
# GALAT: self missing in method
class Student:
 def __init__(name):
 name = name # Kya set hoga✓ Kuch nahi!

# SAHI:
class Student:
 def __init__(self, name):
 self.name = name # Ab name store hoga

# GALAT: self ko manually pass karna
s = Student("Aman")
s.greet(s) # Error!

# SAHI:
s.greet() # Python automatically self pass karta hai
Classes & Objects samajh aa gaya?

Ab Inheritance par chalo � ek class doosri class se kaise properties inherit karti hai.