পাইথন তার অস্তিত্বের শুরু থেকেই একটি অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং ভাষা। ক্লাস ও অবজেক্ট হল অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং-এর দুটি প্রধান বিল্ডিং ব্লক।
একটি ক্লাস অবজেক্টের একটি নতুন টাইপ তৈরি করে যেখানে অবজেক্টগুলো ক্লাসের ইনস্ট্যান্স।
চলুন সবচেয়ে সিম্পল একটি ক্লাস তৈরি করি,
পাইথনে ক্লাস ডেফাইন করা
শুধু একটি খালি ক্লাস ডেফাইন করি।
# Define a class
class Vehicle():
pass # An empty block
# Instantiating objects
v = Vehicle()
print(v)
রেজাল্ট
<__main__.Vehicle object at 0x055DB9F0>
আমরা উপরে কী করেছি?
প্রথমে, class স্টেটমেন্ট ব্যবহার করে নতুন ক্লাস Vehicle তৈরি করা হয়েছে, जिसके পর একটি ইন্ডেন্টেড ব্লক থাকে যা ক্লাসের বডি গঠন করে। আমাদের কেসে খালি ব্লক আছে যা pass স্টেটমেন্ট দিয়ে ইন্ডিকেট করা হয়েছে।
পরবর্তী, Vehicle ক্লাস ব্যবহার করতে এর একটি অবজেক্ট/ইনস্ট্যান্স তৈরি করা হয়েছে ক্লাসের নাম এবং একটি জোড়া প্যারেন্থেসিস দিয়ে। তারপর অবজেক্ট তৈরি হয়েছে কিনা কনফার্ম করার জন্য সিম্পলি প্রিন্ট করলে __main__ মডিউলে Vehicle ক্লাসের একটি ইনস্ট্যান্স রয়েছে তা জানা যায়।
অবজেক্ট (v) একটি ক্লাসের ইনস্ট্যান্স। প্রতিটি নির্দিষ্ট অবজেক্ট একটি নির্দিষ্ট ক্লাসের ইনস্ট্যান্স। আমরা একটি ক্লাসের যত ইচ্ছা তত ইনস্ট্যান্স তৈরি করতে পারি যাতে ক্লাসের মেথড ও প্রপার্টি থাকে।
ক্লাসের ভিতরে ডিফাইন করা সকল মেথড ও ভেরিয়েবল তার অবজেক্টগুলোর জন্য অ্যাক্সেসযোগ্য।
ক্লাসের ভিতরে মেথড ডেফাইন করা
class Vehicle():
def car(self):
color = 'Red'
return color
v = Vehicle()
print(v.car())
print(v)
রেজাল্ট
Red <__main__.Vehicle object at 0x05A59690>
ইনস্ট্যান্স মেথড (Instance Methods)
পাইথনে, যখন ক্লাসের ভিতরে কোনো মেথড ডেফাইন করি, তখন যেকোনো ইনস্ট্যান্স মেথডের জন্য একটি ডিফল্ট আর্গুমেন্ট দিতে হয়, যা হল self। এর মানে হল যখন আমরা সেই ক্লাস থেকে একটি অবজেক্ট তৈরি করি, সেই অবজেক্টটিই সেই মেথডে পাস হবে।
সাধারণত ফাংশন কল করার সময় আমরা কোনো আর্গুমেন্ট (self) দিই না, কিন্তু ক্লাসের ভিতরে সেই ফাংশন ডেফাইন করার সময় আর্গুমেন্ট (self) আবশ্যক।
উদাহরণ দিয়ে উপরের কনসেপ্ট বুঝি।
class myClass():
def myMethod(self):
return 'Hello'
myInstance = myClass()
print(myInstance.myMethod())
রেজাল্ট
Hello
উপরের প্রোগ্রামে, আমরা myClass ক্লাস ডেফাইন করেছি এবং এর ভিতরে myMethod() মেথড ডেফাইন করেছি শুধু একটি আর্গুমেন্ট self পাস করিয়ে।
তবে, যখন আমরা ক্লাসের ইনস্ট্যান্স দিয়ে মেথড কল করি, কোনো আর্গুমেন্ট দিই নাই। এর কারণ হল যখনই আমরা একটি ইনস্ট্যান্সে মেথড কল করি, প্রথম আর্গুমেন্ট স্বয়ংক্রিয়ভাবে সেই ক্লাসের একটি ইনস্ট্যান্স হয়ে যায়।
উপরের প্রোগ্রাম থেকে এক লাইন পরিবর্তন করি:
def myMethod():
আমি শুধু মেথড (myMethod()) থেকে আর্গুমেন্ট (self) সরিয়ে দিয়েছি। এখন আবার প্রোগ্রাম রান করি এবং দেখি কী হয়।
================ RESTART: C:\Python\Python361\oops_python.py ================ Traceback (most recent call last): File "C:\Python\Python361\oops_python.py", line 18, inprint(myInstance.myMethod()) TypeError: myMethod() takes 0 positional arguments but 1 was given
তাই আপনার মেথডের প্রথম আর্গুমেন্ট self হওয়া বাধ্যতামূলক।
ইনস্ট্যান্স অ্যাট্রিবিউট (Instance Attributes)
এইগুলোর হল অবজেক্ট-স্পেসিফিক অ্যাট্রিবিউট যেগুলো __init__ মেথডের প্যারামিটার হিসেবে ডেফাইন করা হয়। প্রতিটি অবজেক্টের নিজস্ব ভিন্ন মান থাকতে পারে।
নিচের উদাহরণ বিবেচনা করুন,
import random
class myClass():
def myMethod(self):
self.attrib1 = random.randint(1, 11)
self.attrib2 = random.randint(1, 21)
myInst = myClass()
myInst.myMethod()
print(myInst.attrib1)
print(myInst.attrib2)
রেজাল্ট
2 18
উপরের প্রোগ্রামে, "attrib1" এবং "attrib2" হল ইনস্ট্যান্স অ্যাট্রিবিউট।
পাইথনে Init কনস্ট্রাক্টর (Init Constructor in Python)
এক কনস্ট্রাক্টর হল একটি বিশেষ ধরনের মেথড যা ক্লাসের ইনস্ট্যান্স মেম্বার ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।
কনস্ট্রাক্টর দুটি প্রকারের হতে পারে:
- প্যারামিটারাইজড কনস্ট্রাক্টর (Parameterized Constructor)
- নন-প্যারামিটারাইজড কনস্ট্রাক্টর (Non-parameterized constructor)
পাইথনে, "__init__" হল প্রতিটি পাইথন ক্লাসের সাথে যুক্ত একটি অনন্য মেথড।
পাইথন এটি প্রতিটি অবজেক্ট তৈরি হওয়ার সাথে সাথে স্বয়ংক্রিয়ভাবে কল করে। এর উদ্দেশ্য হল ক্লাস অ্যাট্রিবিউটগুলোকে ইউজার-সাপ্লাইড মান দিয়ে ইনিশিয়ালাইজ করা।
অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং-এ এটাকে কনস্ট্রাক্টর বলা হয়।
class Employee:
def __init__(self, name):
self.name = name
def display(self):
print("The name of the employee is: ", self.name)
obj1 = Employee('Zack')
obj2 = Employee('Rajesh')
obj3 = Employee('Tashleem')
obj3.display()
obj1.display()
রেজাল্ট
The name of the employee is: Tashleem The name of the employee is: Zack
উপরের প্রোগ্রামে, যখন আমরা ইনস্ট্যান্স (obj1 & obj2) তৈরি করি, name আর্গুমেন্ট পাস করি এবং কনস্ট্রাক্টর সেটি ইনস্ট্যান্স অ্যাট্রিবিউটে অ্যাসাইন করে।
তাই যখন আমরা নির্দিষ্ট ইনস্ট্যান্সে display মেথড কল করি, নির্দিষ্ট নাম পাওয়া যায়।
পাইথনে এনক্যাপসুলেশন (Encapsulation in Python)
পাইথন OOP নেচারল থাকায়, এটি মেথড ও ভেরিয়েবল অ্যাক্সেস রেস্ট্রিক্ট করার পদ্ধতি দেয়।
ডেটা এনক্যাপসুলেশন থাকলে, আমরা সরাসরি অবজেক্টে অ্যাট্রিবিউট কল করে ইনস্ট্যান্স অ্যাট্রিবিউট মডিফাই করতে পারি না। এটি অ্যাপ্লিকেশনকে হ্যাকারদের জন্য আক্রান্ত করতে পারে। তবে, আমরা শুধু নির্দিষ্ট মেথড কল করে ইনস্ট্যান্স অ্যাট্রিবিউটের মান পরিবর্তন করতে পারি।
উদাহরণ
class Product:
def __init__(self):
self.__maxprice = 1000
self.__minprice = 1
def sellingPrice(self):
print('Our product maximum price is: {}'.format(self.__maxprice))
print('Our product minimum price is: {}'.format(self.__minprice))
def productMaxPrice(self, price):
self.__maxprice = price
def productMinPrice(self, price):
self.__minprice = price
prod1 = Product()
prod1.sellingPrice()
prod1.__maxprice = 1500
prod1.sellingPrice()
prod1.__minprice = 10
prod1.sellingPrice()
prod1.productMaxPrice(1500)
prod1.sellingPrice()
prod1.productMinPrice(10)
prod1.sellingPrice()
রেজাল্ট
Our product maximum price is: 1000 Our product minimum price is: 1 Our product maximum price is: 1000 Our product minimum price is: 1 Our product maximum price is: 1000 Our product minimum price is: 1 Our product maximum price is: 1500 Our product minimum price is: 1 Our product maximum price is: 1500 Our product minimum price is: 10
উপরের প্রোগ্রামে, আমরা Product ক্লাসের একটি ইনস্ট্যান্স তৈরি করেছি এবং ইনস্ট্যান্স ভেরিয়েবলের মান মডিফাই করার চেষ্টা করেছি, কিন্তু এখনো কনস্ট্রাক্টরে সেট করা মানই দেখাচ্ছে।
ইনস্ট্যান্স অ্যাট্রিবিউটের মান মডিফাই করার একমাত্র উপায় হল productMaxPrice() বা productMinPrice() মেথড কল করা।