অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং

OOP Full Note: অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং A to Z বিস্তারিত (সব পর্ব)

OOP ব্যাসিক বকবক

OOP কি?
OOP এর অর্থ অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং।

* OOP হচ্ছে একটা থিউরি যা পাইথন, জাভাস্ক্রিপ্ট, জাভা, পিএইচপি সব ল্যাংগুয়েজ এর মধ্যেই ব্যবহার করা হয়। এর মধ্যে পার্থক্য হচ্ছে কিছু ল্যাংগুয়েজ এ কিছু ফিচার দিচ্ছে আর কিছুতে দিচ্ছে না, ব্যাস এতটুকুই।

অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং বলতে কি বুঝায়? 

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং হলো প্রোগ্রামিং কোড লিখার বিশেষ ধরন, যার বেইজ হলো অবজেক্ট. কোডগুলো করা হয় স্ট্রাকচার্ডভাবে।প্রতিটি অবজেক্টের কতগুলো নিজস্ব আলাদা বৈশিষ্ট্য থাকে, যাদের দ্বারা অবজেক্টগুলোকে স্বতন্ত্রভাবে সনাক্ত করা যায়।

প্রৃথিবীতে তে অনেক ডিজাইন প্যাটার্ন রয়েছে। তার মধ্যে সব থেকে জনপ্রিয় হচ্ছে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ডিজাইন প্যাটার্ন। এ কনসেপ্ট খুবই সহজ এবং অনেক শক্তিশালী।

অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কিন্তু কোন ল্যাঙ্গুয়েজ এর নিজস্ব সম্পত্তি না। যেকোনো প্রোগ্রামিং ল্যাঙ্গুয়েজ অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ডিজাইন প্যাটার্ন ব্যাবহার করতে পারে। বিশ্বের জনপ্রিয় প্রোগ্রামিং ল্যাঙ্গুয়েজ গুলো অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর ডিজাইন প্যাটার্ন মেনে চলে, যেমনঃ JAVA, Python, C++, C#, TypeScript, ES6, PHP ইত্যাদি।

Object Oriented Programming আমাদের কিভাবে সাহায্য করে?

অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং আপনার কাজ কে করবে সহজ এবং কোড কে করবে অনেক শক্তিশালী।

OOP বিভিন্ন কাজে লাগে যেমন- ডাটাবেজ ম্যানেজমেন্ট এ কাজে লাগবে, ফ্রন্টএন্ড এ কাজে লাগবে কম্পোনেন্ট খুঁজে পেতে, মোবাইল অ্যাপ্লিকেশন তৈরিতে কাজে লাগবে।

যদি আপনি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ব্যাবহার করে কিছু তৈরী করেন তাহলে সেটা পরিচালনা করতে পারবেন খুব সহজেই।

মনে করুন আপনার সফটওয়্যার এর একটি পার্ট পরিবর্তন করতে চাচ্ছেন বা আরো উন্নত করতে চাচ্ছেন, এখন আপনি যদি আপনার সফটওয়্যার এ অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ব্যাবহার করে কোড করে থাকেন তাহলে সেই নির্দিষ্ট একটি পার্ট অন্য কোন পার্ট এর মধ্যে হাত না দিয়েই সেটা খুব সহজে পরিবর্তন বা উন্নত করতে পারবেন। কারন অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং প্রত্যেকটি কাজ এর জন্য আলাদা আলাদা ক্লাস ব্যাবহার করা হয়ে থাকে ফলে সহজেই যে পার্ট টি নিয়ে কাজ করতে হবে সহজেই সেই পার্ট টি নিয়ে কাজ করা যায়। অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এ কোড থাকবে সুন্দরভাবে সাজানো গোছানো, ফলে আপনার করা কোড অন্য একজন প্রোগ্রামার দেখেই বুঝতে পারবে।

অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর বৈশিষ্ট্য:

  • সফটওয়্যার ডেভেলপ করতে বা বড় প্রোগ্রাম তৈরিতে OOP জানা লাগে।
  • OOP’র আসল উদ্দেশ্য বাস্তব জীবনের সাথে সামঞ্জস্য রেখে প্রোগ্রাম করতে পারা।

OOP আসার পূর্বে প্রোগ্রামাররা কিভাবে কোড করত?
ans: procedural way তে ও Struct কনচেপ্ট এর মাধ্যমে।
আর এখন কিভাবে করে?
ans: OOP এর মাধ্যমে।
এই ২টা বিষয়জ্ঞান থাকাটা কিছুটা হলেও জরুরি।

procedural way তে একটার পর একটা ডেটা লিখে, বিভিন্ন ভ্যারিয়েবল এর ভেতর ডেটা স্টোর করে বিভিন্ন ফাংশন তৈরি করে, ফাংশন এর ভেতর ডেটাগুলোকে আর্গুমেন্ট আকারে পাস করে। ডেটা, ফাংশন সব এক ফাইলে থাকত।
ভ্যারিয়েবলের ভেতর ডেটা থাকত। ভিন্ন ভিন্ন ইউজারের জন্য ডিফারেন্ট ডেটা, ডিফারেন্ট ভ্যারিয়েবল নিয়ে হ য ব র ল অবস্থায় কাজ করতে হত।

procedural way এর প্রব্লেম সলভ করা হল Struct নামক একটা কনচেপ্ট এর মাধ্যমে, যেটা একটা স্ট্রাকচার দাড় করালো। যার মাধ্যমে আমরা অনেকগুলো user object দাড় করাতে পারি,  ভ্যারিয়েবলগুলোকে একটা জায়গায় গুচ্ছ করতে পেরেছি। যেখানে ডেটার শেপটা কমন, actual data ভিন্ন।
c programming এ এটা ব্যবহার করা হয়।

Disadvantage of procedural programming:
* code is not reusable.
* large code base is hard to manage.
* Difficult to tracing & fixing bug.
* Data is exposed to whole program
* operation priority is higher than data
* difficult to relate with real world data

OOP কোর নলেজ

অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং পুরোপুরি বুঝতে যা যা জানতে হবে (যেসব টপিক বুঝতে হবে)- 

Object, Attribute, Method.

Class.

Abstraction,

Encapsulation (Data Hiding), Dynamic Binding, Message Passing,

Inheritance,

Polymorphism,  Exception Handling.

#

OOP এমন একটি প্রোগ্রামিং ফিগার যেটার বেস হচ্ছে “object” যেটার মধ্যে ডেটা অ্যাট্রিবিউট আকারে থাকে, এবং কিছু procedure মেথড আকারে থাকে। সব প্রোগ্রামিং ল্যাঙ্গুয়েজ এ অবজেক্ট নেই,এখানে সাধারণ প্রবলেম সলভ করতে পারা যায় কিন্তু OOP তে সাধারন প্রবলেম সলভ করার পাশাপাশি অবজেক্ট রিলেটেড প্রবলেম ও সলভ করা যায়।

#
* Finding Object, It’s Properties and Methods are the main machanism of learning OOP.
* Object is king in OOP.
* OOP শিখতে গেলে object খুজে বের করা শিখতে পারলে ৫০% কাজ হয়ে যায়।
কোথায় object আছে, কিভাবে object আছে সেটা বের করে আনাই important.

object

অবজেক্ট কি?
অবজেক্ট হলো, হলো একটা উপাদান । যদি পাইথন এর কথায় আসি পাইথন এর সব কিছু অবজেক্ট ।
ইন্টেজার, ফ্লোট, স্ট্রিং সব কিছু অবজেক্ট হিসাবে কাজ করে । আর এই অবজেক্ট, দিয়ে তৈরী করা হয় মেথড (অনেক টা ফাংশন এর মতো দেখতে)

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

What is an object?
∇ Combination of Noun, Adjective & verb.
∇ A Capsule that can encapsulate Data & Operations.
∇ Has some Private & Public Properties.
∇ Has some Functions which is called methods.
∇ is a Custom Data Type.
∇ An isolated Environment for properties & Methods.

 

Attribute & Method:

প্রতিটা অব্জেক্টের দুই ধরনের বিষয় থাকে। একটা হচ্ছে তার বৈশিষ্ট্য যা তার পরিচয় বহন করে, আরেকটা তার কোয়ালিটি।
যেমন-

. মানুষ যখন অব্জেক্ট তখন মানুষের নাম আছে, তার বয়স আছে,জেন্ডার আছে এইগুলা হচ্ছে মানুষের বৈশিষ্ট্য। সাধারনত এই বৈশিষ্ট্য গুলা চেঞ্জ হয় না।
. আরেকটা হচ্ছে তার কোয়ালিটি। যেমন আমি ভাল গান গাইতে পারি, আপনি ভাল নাচতে জানেন, আরেকজন সুন্দর করে কথা বলতে জানে এইগুলা হচ্ছে কোয়ালিটি। কোয়ালিটি এক এক জনের এক এক রকম হয়।
* পাইথনের ভাষায় বৈশিষ্ট্যগুলাকে আমরা বলি এট্রিবিউট আর কোয়ালিটি গুলাকে আমরা বলি মেথড।

পাইথনের ভাষায়,
properties/বৈশিষ্ট্য গুলোকে বলা হয় Attribute,
আর,
verb/কোয়ালিটি গুলোকে বলা হয় Method।

example 01:
cat object

Properties(Noun/adjective):
Name,
color,
eye,
age

Methods(verb):
eat()
walk()
sleep()

example 02:
Car Object

Properties(Noun/adjective):
Brand,
Color,
Model,
Mileage

Methods(verb):
Accelerate,
break,
gear

Method

মেথড কি ?
মেথড হলো অবজেক্ট এর উপাদান দিয়ে তৈরী করে রাখা কোনো অপারেশন ।

পাইথন এ ২ ধরণে মেথড থাকে।
১.ইনবিল্ড মেথড (ইনবিল্ড মেথড হলো, পাইথনের তৈরি করা মেথড)
২. আমাদের তৈরী করা মেথড

মেথড এর বৈশিষ্ট্যঃ
মেথড , অনেক টা ফাংশান এর মত । কল করার জন্য শেষে রাউন্ড () ব্রাকেট দিতে হয়। এবং ব্রাকেট এর মধ্যে আর্গুমেন্ট পাশ করতে হয়।
যেমন : print(‘Hello World’)
এখানে print() হল ইনবিল্ড মেথড আর ‘hello world’ আর্গুমেন্ট ।

ইনবিল্ড মেথড কি?
আমরা অলরেডি ইনবিল্ড মেথড প্রতিনিয়ত ব্যবহার করি । যেমন print (), open() ইত্যাদি ।

এবার পাইথনের আরো কিছু ইনবিল্ড মেথড সম্পর্কে বলি ।
মনে করেন :
X = [Aouwal, Vai ]
একটা লিষ্ট ডিফাইন করলাম
এখন যদি আমি X লিস্টে একটা ডাটা অ্যাড করতে চায় । আমাকে একটা মেথড ব্যবহার করতে হবে ।
X .append (‘Django Course’)
এখানে append () একটা মেথড । যেটা পাইথন তৈরি করে রাখছে ।

এবার আসি এক্সটার্নাল ভাবে তৈরি করা মেথড :
মনে করেন আপনি BS4 দিয়ে আপনি ডাটা স্ক্র্যাপ করবেন । কেও একজন BS4 লাইব্রেরি দিয়ে স্ক্র্যাপিং জন্য বিভিন্ন অবজেক্ট আকারে বিভিন্ন মেথড তৈরি করে রাখছে । আর আপনি এমনি bs৪ করে কল করে আমাদের প্রোজেক্ট এ তার মেথড গুলা ব্যবহার করতেছি ।

পাইথন এর তৈরি করার লাইব্রেরি/প্যাকেজ ও আছে যেমন, time, request, os ইত্যাদি । এবং বিভিন্ন প্রয়োজনে আমরা সেগুলা কল/ইম্পোর্ট করে তার মেথড গুলা ব্যবহার করি ।

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

extra:

https://prnt.sc/xQZdca1HzJgh
এখানে x একটা ইন্টেজার ভেরিএবল, dict একটা ডাটা টাইপ, print একটা ফাংশন (বা ইনবিল্ড মেথড )
এবং আমি যখন প্রিন্ট type দিলাম আউটপুটে class দেখাচ্ছে ।
নোট : অবজেক্ট কে ক্লাস এর মধ্যে ডিফাইন করতে হয় যেটা সামনে আলোচনা করতে চলেছি।
অথাৎ পাইথন এর সব কিছুই যে অবজেক্ট তা একটা প্রুভ দেখানোর চেষ্টা করলাম ।

be noted

আমরা যারা django নিয়ে কাজ করতেছি আমাদের অবজেক্ট নিয়ে ভালোভাবে স্টাডি করা উচিৎ কারণ আমরা যে Model কে ইনহারিট করে ডাটাবেস তৈরী করি টা পুরো টা অবজেক্ট বেস । কারণ আমরা অবজেক্ট এর মধ্যে সাধারণ নিয়মে লজিক বানাতে পারবোনা । class বেস কাজ করতে হবে।

 

পাইথনের ম্যাজিক

ww
ww
পুরো পাইথন ল্যাঙ্গুয়েজ টা কে নিয়ন্ত্রণ করতেছে এরকম ১০০ মতো বিল্টইন ডাবল আন্ডারস্কোর মেথড/ফাংশন । (যা ক্লাস বা অবজেক্ট এর অন্তরভুক্ত )
এ জন্য পাইথন কে ফাংশনআল প্রোগ্রামিং বলে ।
পাইথন ইন্টারপ্রেটার শুধু মাত্র এই মেথড গুলা কে ই মেশিন এর ভাষায় কনভার্ট করে ।
কারণ সব ধরণের লজিক, কন্ডিশন, মেশিন লার্নিং বলেন আর AI বা যেকোনো কিছুর উৎপত্তি এই অবজেক্ট বেস মেথড/ফাংশন গুলা থেকে ।
এক্সাম্পল:
a = 2
b = 3
c = a + b
print(a)
Result: 5
কিন্তু মজার বিষয় পাইথন (a + b) এর মানে ই বোঝেনা ।
পাইথন বোঝে, একটা ম্যাজিক মেথড/ফাংশন:
def __add__(self, other):
a = self.a + other.a
return a
(নোট: এটা ক্লাস এর একটা পার্ট এটা দেখে বিভ্রান্ত হওয়ার কিছু নেই )

অবজেক্ট কেন দরকার?

আমরা জানি django মডেল এর মধ্যে ক্লাস এর আন্ডার এ কোড লিখতে হয় । যেটা মূলত অবজেক্ট বেস ।
এখানে আমি একটা কন্ডিশন দিয়েছি ।
যদি ডাটা এক্সিস্টিং থাকে তবে তার (২) অ্যাড হবে যদি ডাটার সাথে (২) থাকে তাহলে (৩) অ্যাড হবে । এভাবে চলতে থাকবে যতক্ষণ ইউনিক না হয় ।
কিন্তু প্রথমে সাধারণ নিয়মে ।
self.List_Name + str(i )
দিছিলাম । যেটা এরর আসতেছিল । পরে বুজলাম, ওহ এটা তো অবজেক্ট এটা কে সাধারণ নিয়মে কনকাট করা যাবেনা ।
কিন্তু অবজেক্ট এর মধ্যে ২ টা অবজেক্ট কে অ্যাড করতে চাইলে ।
self.List_Name.__add__str(i )
দিতে হবে, এখানে __add__(object name) হলো অবজেক্ট এর একটা মেথড ।
objj
objj
objje
অব্জজে

class

class: class হচ্ছে এক ধরনের template যেটা ব্যবহার করে আমরা object তৈরি করতে পারি।

একটা class এর ভেতর বিভিন্ন ধরনের ডেটা/properties থাকে এবং বিভিন্ন মেথড ঘটানোর জন্য অপারেটর/ফাংশন থাকে।

 

যদি আপনি অবজেক্ট তৈরি করতে চান তাহলে আপনাকে, প্রতি অবজেক্ট এর শ্রেণী কে class এর মধ্যে ডিফাইন করতে হবে ।

যেমন আমার ফাংশন লেখার জন্য:
def function_name():
এভাবে লিখি ।

তো অবজেক্ট তৈরি করার জন্য :
class ClassName:
এভাবে লিখতে হবে ।

ক্লাস পরিচিতি : ক্লাস মধ্যে কি থাকে ? বা ক্লাসের বৈশিষ্ট কি?
ক্লাসের ২ টা বৈশিষ্ট থাকে ।
১. ভেরিএবল
২. বিহেভিয়ার।

ভেরিএবল কি নিশ্চই আমরা সবাই জানি । এবং ক্লাসের মধ্যে ভেরিএবল কে ক্লাস ভেরিএবল বলে যা ক্লাসের মধ্যে কাজ করে ।
ক্লাস বিহেভিয়ার:
বিহেভিয়ার হলো মেথড । যেটা সম্পর্কে বার বার বলতেছি । এই মেথড আবার ৩ প্রকার ।
নোট: মেথড কে আপাতত ফাংশন ভাবতে পারেন । আশা করি ফাংশন কি সবাই জানেন ।

১. ইনস্ট্যান্ট মেথড / ডাবল আন্ডারস্কোর মেথড / ডান্ডার মেথড ।
২. ক্লাস মেথড ।
৩. স্টাটিক্স মেথড ।
নোট: ইনস্ট্যান্ট মেথড আবার অনেক প্রকার আছে।

3
3

VS Code: https://prnt.sc/iW7p4SBGK08G
// এখানে ____ মানে ইনডেনসন বোঝাইছি ।
তো একটা বেসিক লেভেল এর ক্লাস তৈরি করা যাক ।
class Course:
____def student(self):
________print(‘Hello Student’)

student_one = Course()
student_two = Course()
student_three = Course()
# যত ইচ্ছা অবজেক্ট এর কন্সট্রাক্টর ভেরিএবল তৈরি করা যায়…..
আউটপুট এর জন্য :
Course.student(student _one)
student_one.student()
# যেকোনো ভাবে আউটপুট নেয়া যায় …
প্রথম আউটপুট :Hello Student
দ্বিতীয় আউটপুট : Hello Student

এবার এই class সম্পর্কে বিস্তারিত আলোচনা করা যাক :

এখানে প্রথম লাইনে ক্লাস ডিফাইন করা হয়েছে ।
class Course:
দ্বিতীয় সেকশন এ একটা ফাংশন কল করা হয়েছে ।
def student(self):
____print(‘Hello Student’)

এই ফাংশন ই মেথড, যেটা প্রতিটা ক্লাস এ থাকে । কারণ এই মেথড বা ফাংশন ই ক্লাস এর অপারেশন ।

কিন্তু একটা প্রশ্ন থেকে যায়, নরমালি আমরা যখন ফাংশন লিখি :
def student():
____print(‘Hello Student’)

এভাবে লিখি, তাহলে কেন self দিলাম আর্গুমেন্ট এর মধ্যে ।
এটার, বিশাল ব্যাখ্যা আছে যা পরবতী তে করা হবে । তবে এখন বোঝার জন্য যত টুকু বলবো তা হলো :

আমি, গত পর্বে বলেছি ক্লাস এর মধ্যে ৩ ধরণের মেথড/ফাংশন থাকে ।

আর, এটা এক ধরণের মেথড /ফাংশন যাকে ইনস্ট্যান্স বা কন্সট্রাক্টর মেথড বলে । এবং এই ইনস্ট্যান্স মেথড লেখার জন্য আর্গুমেন্ট এর মধ্যে self লিখতে হয় ।
নোট: এটা কন্সট্রাক্টর মেথড এর সাব মেথড বলতে পারি, পরবর্তী পর্বে কন্সট্রাক্টর মেথড নিয়ে বিস্তারিত আলোচনা হবে ।
এরপর :
student_one = Course()
student_two = Course()
student_three = Course()

এই সেকশন এ ফাংশন ফাংশন কে ভেরিএবল এ এসাইন করে অবজেক্ট তৈরি করা হয়েছে । student_one একটা অবজেক্ট student_two একটা অবজেক্ট student_three একটা অবজেক্ট এভাবে আমরা ক্লাস এর মেথড দিয়ে যত ইচ্ছা অবজেক্ট তৈরী করতে পারি ।

এবং ক্লাস থেকে আউটপুট নিতে গেলে আপনাকে এভাবে অবজেক্ট আকারে ক্লাস কে এসাইন করতে হবে ।

কারণ, এই অবজেক্ট ই হলো ক্লাস এর আরেকটা মূল বৈশিষ্ট্য । আর যে ভেরিএবল এর মধ্যে ক্লাস কে এসাইন করা হয় তাকে কন্সট্রাক্টর/ইনস্ট্যান্স ভেরিএবল বলে ।

যেমনটা এর আগে দেখলাম কন্সট্রাক্টর/ইনস্ট্যান্স মেথড বা ফাংশন । অথাৎ ক্লাস এর মধ্যে অব্যশই ইনস্ট্যান্স মেথড ও ইনস্ট্যান্স ভেরিএবল থাকবে ।

কারণ, যদি এই ক্লাসের কথা বলি, একেকটা স্টুডেন্ট এর একেক রকম বৈশিষ্ট্য থাকবে । student_one নাম হতে পারে বল্টু রোল হতে পারে ১০০, student_two নাম হতে সম্রাট রোল হতে পারে ১৫০। এরকম ।

এবার পরের পার্ট :
Course.student(student_one)
student_one.student()

এখানে, student_one এর আউটপুট কে কল করা হয়েছে ।
অথাৎ আমরা ২ ভাবে কল করতে পারি ।
প্রথমে আমরা ক্লাস এর নাম ধরে, এবং ক্লাস এর অবজেক্ট ধরে কল করলাম । আর আর্গুমেন্ট এ তৈরি করা যেকোনো একটা অবজেক্ট (student_one) পাস করে দিলাম ।
নোট: এখানে, student_one ই হলো self এর আর্গুমেন্ট ।
ওয়ার্নিং : যদি ফাংশন সম্পর্কে ভালোভাবে আগের থেকে না বুজে থাকেন তবে ফাংশন নিয়ে আগে স্টাডি করে ফেলেন না হয় আমি যা আলোচনা করতেছি বুজতে পারবেন না ।
self এর আর্গুমেন্ট কে আরো একটু উদহারণ দেয়া যাক ।
মনে করেন ,
গত পর্বের উদহারণ :
X = [‘Aouwal’, ‘vai’]
যদি, ডাটা অ্যাড করতে চায় ।
X.append(‘Django Course’)
এখানে, X এর জন্য append() মেথড টা কাজ করতেছে । আর এই X লিষ্ট এখানে self এর আর্গুমেন্ট হিসাবে পাস হচ্ছে (মানে X অবজেক্ট নিজে নিজেকে পাস করতেছে যেটা ডিফল্ট ভাবে self ) । আর, ‘Django Course’ হলো আমার দেয়া আর্গুমেন্ট ।
আরেকটু গভীরে যায় ।
একটা সাধারণ ফাংশন লিখি :
def X():
____print(‘This is a General Function’)

যদি ফাংশন কে কোথাও কল করতে চায় :
X()
আউটপুট: This is a General Function

কিন্তু :
X = [‘Aouwal’, ‘vai’]
X.append(‘Django Course’)

X() ফাংশন নিজে নিজে কাজ করলেও,
append() মেথড/ফাংশন X = [‘Aouwal’, ‘vai’] লিস্ট অবজেক্ট এর মধ্যে একটা ডাটা অ্যাড করার জন্য কাজ করতেছে ।

এটাই সব থেকে বড় উদহারণ, self আর্গুমেন্ট পাস করার । যে: X() ফাংশন নিজে নিজে কল হয় । কিন্তু class এর মেথড কোন একটা অবজেক্ট এর জন্য কাজ করে ।

আর সেই অবজেক্ট এর উদহারণ হল:
student_one = Course()
student_two = Course()
student_three = Course()
যেগুলা আমাদের চোখের আড়ালে কাজ করে । যখন আমরা BS4 এর মতো কোনো প্যাকেজ ব্যবহার করি ।

তাছাড়া self পাস করার আরো একটা কারণ হলো,
ক্লাসের মধ্যে ৩ ধরণের মেথড থাকে (যেগুলা সামনের পার্ট গুলি তে আলোচনা হবে ) আর বাকি ২ ধরণের মেথড থেকে এই মেথড কে আলাদা রাখা ।
(এটা, আমার নিজের যুক্তি, কারণ যদি অন্য ২ ধরণের মেথড না থাকতো, তাহলে python তো এমন ভাবে তৈরি করে রাখতে পারতো যে ক্লাসের মধ্যে কোনো ফাংশন লিখলে তা অটোমেটিক self পাস হয়ে যাবে)

আবার এখানে ফিরে আসি :
এবার পরের পার্ট :
Course.student(student_one)
student_one.student()

আমরা ২ ভাবে ক্লাস এর মেথড কে একসেস করতে পারি ।
১. class কে ধরে ক্লাসের মেথড কে ধরে তার মধ্যে self এর আর্গুমেন্ট মানে ইনস্ট্যান্ট ভেরিএবল (যার মধ্যে অবজেক্ট থাকে ) তাকে পাস করে ।

২. ডাইরেক্ট অবজক্ট কে ধরে, মেথড কে কল করা। কারণ আমরা অলরেডি অবজেক্ট এর মধ্যে class কে কল করেছি ।
student_one = Course() #এভাবে
শেষ করার আগে আবার একটু মিল দেখায় :
Course.student(student_one)
X.append(‘Django Course’)

constructor:

constructor: class কিন্তু একটা object না, এটা একটা template যার ভেতর দিয়ে বাইরে থেকে ডেটা পুশ করার একটা অপশন থাকে যাকে আমরা বলি constructor.

কিছু ল্যাংগুয়েজ এ constructor নামে ফাংশন থাকে না। যেমন- java তে constructor ও class নেম একই হয়। class এর নাম কল করলে constructor হয়ে যায়।

object: যেখানে রিয়েল ডেটা আছে সেটা object.
যেখানে রিয়েল ডেটা নেই, শুধু template বানানো আছে সেটা class.

মাল্টিপল ইউজার কল করার মাধ্যমে মাল্টিপল object ক্রিয়েট হবে।
A Class is a template to create multiple object.
Class is Blueprint to create multiple object.

class এ যা যা থাকবে / class এর বৈশিষ্ট্য:-
* নিজস্ব properties/ attributes(ডেটার shape) থাকবে।
* private methods, public methods
( যে ফাংশনগুলো class এর ভেতর ব্যবহার করা হয় তাকে method বলে)

class হচ্ছে shape, আর object হচ্ছে actual data দিয়ে তৈরি করা একটা বস্তু।
কেক/পিঠা মেকারের ছাচটা হচ্ছে একটা class, যার মধ্য দিয়ে অনেকগুলো পিঠা/কেক বের হয়ে আসছে যাকে আমরা object বলি।

Object কি?
Object হচ্ছে যেকোনো কিছু যাকে বুঝানোর জন্য/ডেস্ক্রাইব/define করার জন্য একের অধিক properties লাগে, সেটাই অবজেক্ট।

Object এ যা যা থাকবে:-
* Actual Data
* (public) method

OOP প্রকারভেদ

* OOP has four main pillar.

OOP চার প্রকার। যথাঃ

  1. Abstraction,
  2. Encapsulation,
  3. inheritance,
  4. polymorphism

Abstraction:

 

encapsulation: class এর ভিতরে member function/variable গুলোকে নিয়ে এই নিরাপত্তা-বলয়টাকে বলা হয় encapsulation.

Encapsulation হল একটি concept যা ডেটা এবং ফাংশন কে একসাথে করে রাখে এবং সেগুলোকে সেফ রাখে বাইরের হস্তক্ষেপ ও অপব্যবহার থেকে এবং অবজেক্ট এর ইনফরমেশন গুলো অন্য অবজেক্ট এর কাছ থেকে সংরক্ষিত রাখে।

Encapsulation মানে হলো জিনিসপত্র ক্যাপসুলের মধ্যে ভরে রাখা। অর্থাৎ লুকানো। ক্যাপসুল এর ভেতর যেমন মেডিসিন লুকানো থাকে আবরণ থাকে, তেমনি ডাটাকে private করে রাখা হয় যেন বাইরের কেউ দেখতে না পারে।

আরো সহজ করে বলতে আমরা যাদি প্রোগ্রাম লিখে hello world প্রিন্ট করতে চাই তাহলে printf ফাংশন ব্যাবহার করি।
কিন্তু এই printf ফাংশন কিভাবে করা হয়েছে তা আমাদের জানা নেই।

অবজেক্ট অরিয়েন্টেট প্রোগ্রামিং য়ের এনক্যাপসুলেসন প্রোগ্রামিং এর ভিতরের এনক্যাপসুল কৃত ক্লাস ও গুরুত্বপূর্ণ মেথড বাইরের কা্উকে দেখতে দেয় না। এটা প্রোগ্রামের নিরাপত্তা দেয়।

inheritance: উত্তরাধিকার সূত্রে কোনো কিছু পাওয়াকে ইনহেরিটেন্স বলে। OOP বা অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এ একটি প্রধান ক্লাস এর কিছু প্রোপার্টি নিয়ে নতুন এক বা একাধিক ক্লাস বানানো কে ইনহেরিটেন্স বলে।

exisiting কোন ক্লাস থেকে কিছু ফিচার বা প্রপার্টি নিয়ে নতুন একটি ক্লাস বানানো হলে পরের ক্লাস টিকে বলে Inheritance । এর অর্থ উত্তারাধিকার। মানে পরে বানানো ক্লাসটি ঊত্তারাধিকার সুত্রে আগের ক্লাস থেকে কিছু প্রাপারটি পেয়েছে। এক্ষেত্রে প্রথম ক্লাসকে বলে সুপার ক্লাস এবং পরের ক্লাসকে বলে সাব ক্লাস।

inheritance অর্থ উত্তরাধিকার। অর্থাৎ এখানে পূর্বপুরুষের একটি ব্যাপার আছে।
কতগুলো অবজেক্ট এর সাধারন কিছু ধর্ম বা বৈশিষ্ট নিয়ে একটি পূর্বপুরুষ তৈরী করলে তার পরবর্তি প্রজন্মের মধ্যে তা আপনা আপনি চলে আসবে। একেই Inheritance বলে।

#
OOP শেখার পর থেকে Class দিয়ে ছোট খাটো প্রজেক্ট করলেও Inheritance এর বাস্তব ব্যবহার করা হয়নি । কিন্তু Django মডেল এর মধ্যে এর বাস্তব প্রয়য়োগ দেখতে পাচ্ছি ।
এবং পাইথন ক্লাসে কিছু ম্যাজিক মেথড আছে যেমন : def __str__(self): , ‘__add__’, ‘__and__’, etc ২৫-৩০ টা মতো ।
আগে প্রাকটিস করলেও ভাবতাম এই ম্যাজিক মেথড গুলার কি দরকার । কিন্তু এটার বাস্তব প্রয়য়োগ ও দেখতে পাচ্ছি ।

পলিমর্ফিজম: প্রোগ্রামিংয়ে যখন কয়েকটি অবজেক্ট একটা সাধারণ ইন্টারফেস ইমপ্লিমেন্ট করে বা একটি কমন অবজেক্ট এক্সটেন্ড করে তৈরী হয়, সেই ঘটনা কেই বলা হয় পলিমর্ফিজম।

পলিমরফিজম এর মাধ্যমে মেথড ওভারলোডিং করা হয়। মনে করুন একটি ক্লাস এর মধ্যে একটি মেথড রয়েছে। মেথড এর নাম কিন্তু একটাই, কিন্তু সে ভিন্নি ভিন্ন কাজ করতে সক্ষম। আমরা বলে দিতে পারবো যে কখন এই মেথডটি কিভাবে কাজ করবে।

Programming এ Polymorphism প্রোগ্রামিং ল্যাংগুয়েজ এর একটা বৈশিষ্ট। যেটা বিভিন্ন সময়ে বিভিন্ন ভ্যারিয়েবল ব্যবহার করার অনুমতি দেয়।

Polymorphism ভাংলে পাওয়া যায় many (poly) shapes (morph) যার মানে হচ্ছে বহুরূপতা। প্রোগ্রামিং এ ও একই অর্থ বহন করে। একই জিনিসের বহু আকৃতি বা গঠনই হচ্ছে Polymorphism.

True Relationship between objects

দুইটা অবজেক্ট এর মধ্যে রিলেশনশীপ আলোচনা করা হয়।

user:- admin(sales,support, customer(premium, casual)

product:- digital(ebook, software), physical(ac, cycle)

 

রিলেশনশীপ ২ ধরনের হয়ে থাকে- 

১) is a Relationship (inheritence)

যেমন- Person:- student, guardian, employee(teacher, stuff)

২) has a Relationship (composition, aggregation)

student:- department(subject)

যে অবজেক্টগুলো প্যারেন্ট অবজেক্ট এর উপর পুরোপুরি নির্ভর না, সে নিজের মতো করে ক্রিয়েট হতে পারে, নিজের মতো করে চলতে পারে সেই অবজেক্ট গুলোর সাথে যে রিলেশনশিপ হয় তাকে বলা হয় aggregation.

যদি পারেন্ট child সম্পর্কের মধ্যে প্যারেন্ট অবজেক্ট যদি ডেস্ট্রয় হয়ে যায় তাহলে সেটা composition. আর চাইল্ড নিজের মত ক্রিয়েট, ডেস্ট্রয় যা ইচ্ছে তা হতে পারে তখন তাকে বলা হয় aggregation.

 

ম্যানেজমেন্ট সিস্টেমঃ 

স্কুল ম্যানেজমেন্ট, ইউনিভার্সিটি ম্যানেজমেন্ট, হোটেল ম্যানেজমেন্ট, হোস্টেল ম্যানেজমেন্ট, অফিস ম্যানেজমেন্ট,

 

উদাহরণসহ পাইথনে ধাপে ধাপে OOP শিখি

পার্ট ০১:- Python OOP Concept:

উদাহরণ পাইথন প্রোগ্রাম হিসেবে একটা ডাটা টাইপ নিই:-
str1 = “Update Guides”
print(str1)
print(str1.lower())

ডাটা টাইপটাকে প্রিন্ট করলে আউটপুট আসবে-
Update Guides
update guides
→১ম লাইনের আউটপুটে শুধু ভ্যালুটা পাব।
→২য় লাইনে আউটপুটে lower case সব ভ্যালু পাব।


# পাইথনে প্রতিটি জিনিসই অবজেক্ট(Object)।


OOP এর ভাষায় বললে,
# প্রতিটি Object এর ২টা জিনিস থাকে-
১. Attribute (ডাটার ভ্যালুটাকে নির্দেশ করে) : OOP ধারণায়/ভাষায় ডাটার ভ্যালুটাকে বলা হয় Attribute।
২. Method (ডাটাকে ম্যানুপুলেশন করাকে বলা হয় Method) : যে ডাটাকে ম্যানুপুলেশন করলাম তাকে বলা হয় Method।

# অবজেক্ট(Object) টাকে প্রুপ করার জন্য তার আগে type লিখে দিলে জানা যাবে এটি কোন ক্লাস(class) এর instance/object.
# মনে রাখবে, instance বা objects একই কথা/অর্থে ব্যবহার করা হয়।

উদাহরণ পাইথন প্রোগ্রাম হিসেবে
আরো একটা ডাটা টাইপ নিই:-
num1 = 10
str2 = str(num1)

print(type(str2))
type লিখে ডাটা টাইপটাকে প্রিন্ট করলে আউটপুট আসবে-
<class ‘str’>
অর্থাৎ এই জিনিসটাকে আমরা string এর একটা instance or object বলতে পারি। যাকে আমরা class এর মধ্যে define করে থাকি।
এভাবে করে যেকোনো ডাটা টাইপ কোন ধরনের object তা জানা যায়।

নরমালি অন্যভাবে বললে,
# প্রতিটি অবজেক্ট এর দুটো জিনিস থাকে।
১. ভ্যালু(ডাটা টা)
২.বিহ্যাবিয়ার(ডাটা টাকে ম্যানুপুলেট করতে যেটা ব্যবহার করা হয়)

 

 

পার্ট ০২: OOP Construction:

OOP তে সবকিছু একটা class এর অন্তর্ভূক্ত।
এখন আমরা OOP কনসট্রাকশন অর্থাৎ class ডিক্লেয়ারেশন/কনসট্রাকশন শিখব।

ধরি,আমরা নিজেদের একটা ই-কমার্স সাইটের প্রোডাক্ট নিয়ে ক্লাস তৈরি করতে চাই, তাহলে যা যা করব:
একটা নতুন ফাইলে একটা ছোট্ট প্রোগ্রাম লিখি-
class Product:
pass
[নিয়ম: মনে রাখবে, class শব্দের পরে ক্লাসের নামটা সবসময় বড় হাতের লিখব, যেমন- Product এর P]

item = Product()
print(item)

[() লিখার মধ্যে instance/object তৈরি হয়ে যায় যেখানে ভ্যালু থাকা/না থাকা বা পাস করা না করা আপনার উপর ডিপেন্ড করে। যেটা নির্ভর করে উপরের ক্লাসটা কিভাবে তৈরি/কনস্ট্রাকশন  করছেন তার উপর।

item = Product()
item.price = 80
print(item.price)

print(type(item))
এটা লিখলে কোন ক্লাসের অংশ তা দেখা যায়।

পার্ট ০৩: init method or Attribute Concept

এখন আমরা init _ _(self,): এর মাধ্যমে attribute assign করা শিখব।

ধরি, একটা ই-কমার্স সাইট তৈরি করব যেখানে কয়েকটা জিনিস থাকতে পারে যথা: নাম, প্রাইস, কোয়ান্টিটি।
object এর মাধ্যমে এসব প্রাইমারি ভ্যালু ক্রিয়েট করার জন্য এক্ষেত্রে init ব্যবহার করতে হয়। মুলত পরবর্তীতে অনেকগুলো প্রাইমারি ভ্যালু নিয়ে কাজ করতে অব্জেক্ট ক্রিয়েট করার জন্য ওই সুবিধার্থে arg গুলোর স্থলে _ _init _ _(self,) দিয়ে ডিফাইন করি। self টা by default হিসেবে থাকে, self দ্বারা বুঝানো হয় এটা এ ক্লাসের একটা অংশ। বেশিরভাগ ক্ষেত্রেই এই self টা ব্যবহার করা হয়, তবে কিছুক্ষেত্রে এর ব্যতিক্রম দেখা যায় তা একটু পরেই দেখব।
মুলত, def function(arg1 arg2 ..etc)
বা
def add(a,b):
return a+b
এর পরিবর্তে এটা ব্যবহার করি।

OOP তে অবজেক্ট ক্রিয়েট করার মাধ্যমে লিখতে চাইলে একটা নতুন ফাইলে প্রোগ্রামটা লিখি-
class Product:
def _ _init_ _ (self, name, price, quantity):
self.name = name
self.price = price
self.quantity = quantity

items = Product(‘Mobile Phone’, 8000 ,150)

item2= Product(‘Laptop’, 1000 ,100)

init এর ভ্যালু আকারে অর্থাৎ attributes হিসেবে নাম, প্রাইস, কোয়ান্টিটি যা আছে সেগুলো কল/print করে স্পেসিফিক ডাটাটাকে আমরা এক্সেস করতে পারি-
print(items.name)
print(items.price)
print(items.quantity)

print(items2.name)
print(items2.price)
print(items2.quantity)

পার্ট ০৪: Python OOP method concept

class Product:
def _ _init_ _ (self, name, price, quantity):
self.name = name
self.price = price
self.quantity = quantity

ধরুন টোটাল প্রাইসটা আমরা বের করব, তাহলে-
def total_price(self):
return self.price * self.quantity

print(items.total_price())
করা যায়।

অর্থাৎ পার্ট ৩ ও ৪ এ আমরা শিখেছি কিভাবে
self এর attributeগুলো নিয়ে class তৈরি করা যায় ও object কে assign করা হয় এবং
function নিয়ে/ডেভেলপ করে method তৈরি করা যায়। এভাবে OOP এর object নিয়ে কাজ করা হয়।

পার্ট ০৫: Python OOP Data Validation

এই পার্টে আমরা কিছু এলোমেলো ঝামেলা/সমস্যায় পড়লে করণীয় সমাধান সম্পর্কে জানব।
যেমন-
items = Product(‘Mobile Phone’, ‘8000’ ,150)
এক্ষেত্রে, price এর float নাম্বারকে string বানিয়ে দিই তাহলে ভুল আউটপুট দেবে।
এ সমস্যা সমাধানের জন্য
Data Validation এর অনেকগুলো সিস্টেম আছে। তার মধ্যে আমরা আপাদত ২টা পদ্ধতি জানব।
১) init এর মধ্যেই data types বলে দেয়া। কোলন দিয়ে কি ধরনের ডাটা তা বলে দেওয়া। যেমন-
def _ _init_ _ (self, name: str, price: float, quantity: int):
self.name = name
self.price = price
self.quantity = quantity

items = Product(‘Mobile Phone’, ‘8000’ ,150)

print(items.price)

তাহলে কোনো error দেখাবে না। এভাবে এ সমস্যাটা সমাধান করা যায়।

২)
আরেকটা জামেলা হতে পারে price, quantity এর নেগেটিভ মান নেওয়ার ক্ষেত্রে। সেক্ষেত্রে, assert ফাংশন ব্যবহার করে data validation যেভাবে করব-
assert price >= 0, ‘Price must be greater than 0’
assert quantity >= 0, ‘quantity must be greater than 0’

তাহলে সম্পূর্ণ কোডটি হবে নিম্নরূপ:-
class Product:
def _ _init_ _ (self, name: str, price: float, quantity: int, discount =0):

# data validation
assert price >= 0, ‘Price must be greater than 0’
assert quantity >= 0, ‘quantity must be greater than 0’
assert discount >= 0, ‘discount must be greater than 0’

#assign to object
self.name = name
self.price = price
self.quantity = quantity
self.discount = discount

def total_price(self):
return self.price * self.quantity

def net_payable(self):
main_percentage = 1 – self.discount/100
net_amount = self.price * self.quantity * main_percentage
return net_amount

items = Product(‘Mobile Phone’, 8000 ,150)
item2= Product(‘Laptop’, 1000 ,100)

print(items.price)
print(items.total_price())

এখন আমরা 10% parcentage discount যুক্ত করব। এজন্য:-

item3= Product(‘Moneybag’, 280, 15 ,10)

print(items3.net_payable())

পার্ট ০৬: OOP Class level attribute

অন্য আরে আমরা 10% parcentage discount যুক্ত করব। এজন্য attribute/method যেভাবে সেট করব:-

class Product:
def _ _init_ _ (self, name: str, price: float, quantity: int, discount =10):

# data validation
assert price >= 0, ‘Price must be greater than 0’
assert quantity >= 0, ‘quantity must be greater than 0’
assert discount >= 0, ‘discount must be greater than 0’

#assign to object
self.name = name
self.price = price
self.quantity = quantity
self.discount = discount

def total_price(self):
return self.price * self.quantity

def net_payable(self):
main_percentage = 1 – self.discount/100
net_amount = self.price * self.quantity * main_percentage
return net_amount

ডিস্কাউন্ট টা আরো একভাবে যুক্ত করা যায়। ক্লাস লেভেল এট্রিবিউট এর মাধ্যমে। যেমন-
class Product:
discount = 10

পার্ট ০৭: Magic method – python OOP Dict & Doc

 

 

এই আর্টিকেল হতে আমরা যা তা জানতে পারব-

  • অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং বলতে কি বুঝায় (Oop কি),
  • অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর বৈশিষ্ট্য, 
  • অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর সুবিধা, 
  • অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং PDF,
  • অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং সাজেশন

এই আর্টিকেল তৈরিতে কৃতজ্ঞতা source/ তথ্যসুত্র: stack learner yt, Abdul Awal vai course samrat vai, webcoachbd.com, howtocode.dev,

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *