Encapsulation
Code áážáŹ áááşááᯠááŻáśá¸áá˛
Python áážáŹ Data Hiding ááŻááşáá˛áˇ áááąáŹáá°ááŽááťááş (Developer áá˝áą áĄááťááşá¸ááťááşá¸ ááŹá¸áááşáá˛áˇ áááşášááąá) áážááááşá
áĄá˛áˇááŤá Underscore (_) áá˛á
Attribute (data) áá áşááŻáá˛áˇ ááŹáááşáážáąáˇáážáŹ underscore (_) áá áşáᯠáááˇáşáááŻááşáááş...
áááŻáˇ ááźáąáŹáááŻááşááŹá
ááááŻááşá¸ áá˛áˇáááşá¸ (No Encapsulation)
Bank account áá áşáᯠááąáŹááş ááźááˇáşáááşá
class BadBankAccount:
def __init__(self, name, balance):
self.name = name
self.balance = balance # ááŤá áĄááźááşáááą áááŻááşáááŻááş ááŻáśá¸áááŻáˇááááş
# Object áá˝áąá¸áááş
my_account = BadBankAccount("My Bro", 1000)
print(f"Balance: {my_account.balance}") # 1000
# The Problem
# áĄááźááşáááą áá
áşááąáŹááşááąáŹááşá áááŻááşáááŻááş áááşááŻáśá¸áááş
my_account.balance = -9999999 # ááťá˝ááşá¸áááŻá¸ááźáŽ
print(f"New Balance: {my_account.balance}") # -9999999
# Bank account á minus ááźáá˝áŹá¸ááźáŽá áážáŻááşááŻááşááźáŽáWith Encapsulation
áĄááŻ... _ (underscore) ááŻáśá¸ááźáŽá¸ áážááşáááşá ááśááŤá¸ááąáŤááş (methods) áá˝áąáá˛áˇáᲠáááş/áá˝ááş áááŻááşá¸áááşá
class GoodBankAccount:
def __init__(self, name, balance):
self.name = name
self._balance = balance # 1. áážááşáááŻááşááźáŽ (Internal Use Only)
# 2. "Public Interface" (ááśááŤá¸ááąáŤááş) áá˝áą ááąáŹááşáááş
# "Getter" (Data ááᯠááąáŹááşá¸ ááźááˇáşáááŻáˇ)
def get_balance(self):
print("Authenticating user...") # ááŽááąááŹáážáŹ Security áĄáááşáˇáá˝áą áááşáˇáááŻáˇááááş
return self._balance
# "Setter" (Data ááᯠááźááşáááŻáˇ)
def deposit(self, amount):
if amount <= 0:
print("bro... positive number áááˇáş")
return
self._balance += amount
print(f"Done. New balance: {self._balance}")
def withdraw(self, amount):
if amount <= 0:
print("WTF bro?")
return
if amount > self._balance:
print("Bro... áááŻááşááś áááąáŹááşáá°á¸")
return
self._balance -= amount
print(f"Done. New balance: {self._balance}")áĄáᯠááŻáśá¸ááźááˇáşáááş:
# Object áá˝áąá¸áááş
my_account = GoodBankAccount("My Bro", 1000)
# áááŻááşáááŻááş ááŻáśá¸áááŻáˇ ááááąáŹáˇáá°á¸
# print(my_account._balance) # áááŻááş áááˇáşáá˛áˇáĄááŹ
# ááśááŤá¸ááąáŤááş (Methods) áááąáᲠááŻáśá¸ áááş
print(f"Current Balance: {my_account.get_balance()}") # 1000
# áááŻááşááś ááŻáśá¸áááş
my_account.deposit(500) # "Done. New balance: 1500"
my_account.withdraw(200) # "Done. New balance: 1300"
# áá
áşááąáŹááşááąáŹááşá ááŻáśá¸ááźááˇáşáááş
my_account.deposit(-100) # "bro... positive number áááˇáş"
my_account.withdraw(5000) # "Bro... áááŻááşááś áááąáŹááşáá°á¸á"
# Safe ááźá
áşáá˝áŹá¸ááźáŽá
# áĄáá˝ááşá¸áááŻááşá¸ (internal) á _balance ááᯠááśááŤá¸ááąáŤááş áá˝áąá ááŹááŹá¸ááąá¸áááşá
print(f"Final Balance: {my_account.get_balance()}") # 1300 (Safe ááźá
áşááąáááş)_balance ááᯠááśááŤá¸ááąáŤááş áá˝áąá ááŹááąá¸ááŹá¸áááşá
Python áá˛áˇ áĄáá˝áąá¸áĄááąáŤáş
Bro... my_account._balance = -9999 áááŻáˇ áááŻááşáááŻááş áááŻááşáááˇáşáááş áááąá¸ááŹáá˛?
Python áážáŹ áááŤáááşá ááŹáááŻáˇáá˛áááŻááąáŹáˇ Python áá˛áˇ Vibe á... We are all consenting adults here. (ááťá˝ááşááąáŹáşáááŻáˇáĄáŹá¸ááŻáśá¸á áá˝ááˇáşááźáŻááťááşáá˛áˇ ááąáŹááşáá˝ááşááąááźáá˛áˇ áá°ááźáŽá¸áá˝áąááŤá)
bro á áĄá˛áˇ áááŻááşá¸ááŻááşááᯠáááşááźáŽá¸ ááááş áááşááŻáśá¸... ááťá˝ááşá¸áá˝áŹá¸áááşááąáŹáˇ bro ááŹáááşáá˛á
Double Underscore (__) - Name Mangling
Single underscore (_) á áááąáŹáá°ááŽááťááşáá˛á ááŤááąáááˇáş bro á ááááşááᯠááŹáá˝ááşááťááşáááş double underscore (__) ááŻáśá¸áááŻáˇááááşá
class SecureBankAccount:
def __init__(self, name, balance):
self.name = name
self.__balance = balance # Double underscore ááŻáśá¸ááŹá¸áááş
def get_balance(self):
return self.__balance
def deposit(self, amount):
if amount > 0:
self.__balance += amount
# Object áá˝áąá¸áááş
secure_account = SecureBankAccount("Secure User", 5000)
# áááŻááşáááŻááş ááŻáśá¸ááźááˇáşáááş
try:
print(secure_account.__balance) # Error áááşáááş!
except AttributeError as e:
print(f"Error: {e}") # AttributeError: 'SecureBankAccount' object has no attribute '__balance'
# Methods áááąááąáŹáˇ áĄáááşááźáąáááş
print(f"Balance: {secure_account.get_balance()}") # 5000Name Mangling á ááŹááŻááşááŹáá˛?
Double underscore (__) ááŻáśá¸áááş Python á ááŹáááşááᯠáĄáááŻáĄááťáąáŹááş ááźáąáŹááşá¸ááąá¸áááşá __balance á _ClassName__balance ááźá
áşáá˝áŹá¸áááşá
# ááááşááąáŹáˇ ááŽááᯠááŻáśá¸áááŻáˇáááąá¸áááş ááŤááąáááˇáş áááŻááşáááˇáşáá°á¸
print(secure_account._SecureBankAccount__balance) # 5000
# ááŤá Python á "bro áááŻáˇ ááááźáŽá¸ááŹá¸ ááźá
áşááŤá
áą" áááŻáá˛áˇ áááąáŹáá˛- Single underscore (_): áááąáŹáá°ááŽááťááşáĄáá˝ááş ááŻáśá¸áááş
- Double underscore (__): Name mangling ááŻááşááťááşáááş ááŻáśá¸áááş (ááŹáá˝ááşáážáŻ áááŻáĄááşáá˛áˇ áĄááŤ)
Encapsulation ááᯠáááşááąáŹáˇ ááŻáśá¸áááˇáşáá˛?
Example 1: User Authentication System
Password áá˝áą ááŻáśááźáŻáśáĄáąáŹááş ááááşá¸ááŹá¸ááťááşáá˛áˇáĄááŤá
class User:
def __init__(self, username, password):
self.username = username
self.__password = password # Password ááᯠáážááşááŹá¸áááş
def check_password(self, input_password):
# Password á
á
áşáá˛áˇ method
return self.__password == input_password
def change_password(self, old_password, new_password):
if self.check_password(old_password):
self.__password = new_password
print("Password changed successfully!")
else:
print("Wrong old password!")
user = User("john_doe", "secret123")
# Password ááᯠáááŻááşáááŻááş áááşáááŻáˇ áááá°á¸
# print(user.__password) # Error!
# Method áááąáᲠcheck ááŻááşááááş
print(user.check_password("wrong")) # False
print(user.check_password("secret123")) # TrueExample 2: Temperature Sensor
Temperature value áá˝áąááᯠvalidate ááŻááşááťááşáá˛áˇáĄááŤá
class TemperatureSensor:
def __init__(self):
self._temperature = 0 # áĄáá˝ááşá¸ data
self._min_temp = -50
self._max_temp = 150
def get_temperature(self):
return self._temperature
def set_temperature(self, temp):
# Validation ááŻááşáááş
if self._min_temp <= temp <= self._max_temp:
self._temperature = temp
print(f"Temperature set to {temp}°C")
else:
print(f"Invalid temperature! Must be between {self._min_temp} and {self._max_temp}")
sensor = TemperatureSensor()
sensor.set_temperature(25) # Temperature set to 25°C
sensor.set_temperature(200) # Invalid temperature!
sensor.set_temperature(-100) # Invalid temperature!
print(f"Current temp: {sensor.get_temperature()}°C") # 25°CExample 3: Shopping Cart
Shopping cart áážáŹ item áá˝áąááᯠááááşá¸ááťáŻááşááťááşáá˛áˇáĄááŤá
class ShoppingCart:
def __init__(self):
self._items = [] # Item list ááᯠáážááşááŹá¸áááş
self._total = 0
def add_item(self, item_name, price):
if price <= 0:
print("Price must be positive!")
return
self._items.append({'name': item_name, 'price': price})
self._total += price
print(f"Added {item_name} - ${price}")
def get_total(self):
return self._total
def get_item_count(self):
return len(self._items)
cart = ShoppingCart()
cart.add_item("Laptop", 1000)
cart.add_item("Mouse", 25)
cart.add_item("Invalid", -50) # Price must be positive!
print(f"Total items: {cart.get_item_count()}") # 2
print(f"Total price: ${cart.get_total()}") # $1025
# List ááᯠáááŻááşáááŻááş ááźááşáááŻáˇáááá°á¸
# cart._items = [] # áááŻááşáááˇáş- Data ááᯠvalidate ááŻááşáááŻáˇ áááŻáĄááşáá˛áˇáĄá፠(áĽáááŹ: temperature range, price > 0)
- Sensitive data áá˝áą (passwords, personal info) ááᯠprotect ááŻááşááťááşáá˛áˇáĄááŤ
- Object áá˛áˇ internal state ááᯠáááźáŹá¸áá°áá˝áą áááźáąáŹááşá¸á áąááťááşáá˛áˇáĄááŤ
- Business logic áá˝áą enforce ááŻááşááťááşáá˛áˇáĄá፠(áĽáááŹ: withdraw áááŻááşáááş balance check ááŹááťááŻá¸)
áĄáážá áşááťáŻááş
- Encapsulation: Data (Attributes) + Methods (Functions) áá˝áąááᯠáĄááŻááş (Bundle) áá áşááŻáááşá¸ (Object) áážáŹ áááˇáş (pack) ááŹá
- Data Hiding: áĄáá˝ááşá¸ data (Internal Data) áá˝áąááᯠáážááş (Hide) ááŹá¸ááŹá
- Why Hide?: áá áşááąáŹááşááąáŹááşá ááŻáśá¸áááŻáˇ áážáŻááşáá˝ ááá˝áŹá¸áĄáąáŹááşá safe ááźá áşáĄáąáŹááş ááŹáá˝ááşááąá¸ááŹá
- How in Python?: Attribute áážáąáˇáážáŹ _ (underscore) áááˇáşááźáŽá¸ á፠áĄáá˝ááşá¸ data áááŻáˇ áááąáŹáá°ááŽááťááş ááźá
- Double Underscore (__): Name mangling áĄáá˝ááş ááŻáśá¸áááşá áááŻááŻáśááźáŻáśáĄáąáŹááş ááŻááşááťááşáááşá
- How to Use?: áážááş (hidden) ááŹá¸áá˛áˇ data áá˝áąááᯠááŻáśá¸ áááŻáˇ
get_...()set_...()(Getter/Setter) ááᯠááśááŤá¸ááąáŤááş (public methods) áá˝áą ááąáŹááşááŹá¸ááąá¸á