OOP:
OOP এর পূর্ণরূপ হলঃ Object-Oriented Programming। OOP তে সবকিছুই অবজেক্ট। যেমন- আপনি আমাদের এই বিশ্বকে নিয়ে কল্পনা করতে পারেন যা চাঁদ, সূর্য, পৃথিবী ইত্যাদি অবজেক্ট নিয়ে গঠিত।
একইভাবে, আপনি একটি গাড়ি কল্পনা করতে পারেন যা চাকা, গিয়ার, ইঞ্জিন ইত্যাদি অবজেক্ট নিয়ে গঠিত।
অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর ধারণাও অনেকটা পথিবী এবং গাড়ির মতই। এটি সবকিছুকেই অবজেক্ট হিসাবে বিবেচনা করে। আপনি এই অবজেক্ট সমূহ ব্যবহার করে বিভিন্ন অ্যাপ্লিকেশন তৈরি করতে পারেন।
Create A Class
class Person:
pass
Create An Instance And Access Class Attribute
class Person:
name = 'olee' #class Attribute
p1= Person()
print(p1.name)
Create A Method Inside Class And Access
class Person:
def hello(self):
print('Hello World')
p1= Person()
p1.hello()
self কীওয়ার্ড : self দ্বারা নিজ ক্লাসকে ইন্ডিকেট করে। যখন আমরা কোনো অবজেক্ট তৈরী করি এবং অবজেক্ট এর কোনো মেথড কল করি ওই মেথড এ তখন অটোমেটিক একটা আর্গুমেন্ট পাস করে যা ওই অবজেক্ট কে নির্দেশ করে। যখন আমরা p1 অবজেক্ট এর hello মেথড কল করি তখন অটোমেটিক একটা আর্গুমেন্ট পাস হয় যা p1 অবজেক্ট কে ধারণ করে। যার কারণে p1.name দ্বারা p1 এর নিজস্ব name আবার ক্লাস এর মধ্যে self.name দ্বারা Person ক্লাস এর name নির্দেশ করে।
__init__ () Method
এই মেথডটা ক্লাস এর ইনস্ট্যান্স যখন কল করে অবজেক্ট তৈরী করি তখন কন্সট্রাক্টর এর মত কাজ করে। ডিফল্টভাবে init () একটি পেরামিটার self নামে অন্য নামেও নিতে পারি।এটা বাধ্যতামূলক নিতেই হবে যা দিয়ে আমরা ক্লাস এর প্রপার্টি এক্সেস ও এসাইন করবো।যেমন init (myarg) .
মনেকরি আমরা যদি চাই অবজেক্ট তৈরী হওয়ার সময় ইনস্ট্যান্ট এট্রিবিউট হিসাবে কিছু নিবো। তাহলে init মেথড এ প্রথম পেরামিটার এর পর আমাদের কন্সট্রাক্টর এট্রিবিউট লিখতে পারি। def init(self, fname ): । এই এট্রিবিউট কে ক্লাসের এট্রিবিউট হিসাবে ধরতে নিচের মত এক্সেস করতে হবে
class Person:
country='bd' # class attribute
def __init__(self, fname):
self.name = fname #instance attribute
def hello(self):
print('Hello World')
p1= Person('olee')
print(p1.name)
এখানে আমরা self.name = যখন দিলাম তখন name নামে এই ক্লাসের একটি প্রপার্টি তৈরী হয়ে গেলো যা আমরা অবজেক্ট তৈরী করে এক্সেস করলাম।
Class Attribute VS Instance Attribute
যখন একটা ক্লাস এর ইনস্ট্যান্স অবজেক্ট তৈরী করে অবজেক্ট হতে কোনো এট্রিবিউট তৈরী হয় তখন সেটা ইনস্ট্যান্স এট্রিবিউট। আর যে এট্রিবিউট ক্লাস এর মধ্যে থাকে সেটা ক্লাস এট্রিবিউট।এক কথায় অবজেক্টের নিজের প্রপার্টি কে ইনস্ট্যান্স ভ্যারিয়েবল বলে।main ক্লাসের প্রোপার্টিকে ক্লাস প্রপার্টি/ভ্যারিয়েবল বলে।
class Student:
pass
olee = Student()
mim = Student()
#after creating instance of class or create a object . assign attribute is instance attribute
olee.name= 'olee ahmmed'
mim.name = 'mahmuda farjana'
print(olee.name)
print(mim.name)
class Person:
country='bd' #class Attribute
def __init__(self, fname, age):
self.name = fname
self.age = age
self.birthyear = 2000 # Instance Attribute
def hello(self):
print('Hello World')
p1= Person('olee',10)
print(p1.name)
print(p1.birthyear)
__dict__ Get Class/Object Property And Value
class Student:
name=''
olee = Student()
mim = Student()
#after creating instance of class or create a object . assign attribute is instance attribute
olee.name= 'olee ahmmed'
mim.name = 'mahmuda farjana'
print(olee.__dict__)
print(Student.__dict__)
Every Object Is Deferment But Class Same
class Mobile:
manufacturar = 'China'
def __init__(self, mobilename, mobilemodel,mobileprice):
self.name = mobilename
self.model = mobilemodel
self.price = mobileprice
print(f' Your Mobile Name Is {self.name} \n Your Mobile Model Is {self.model} \n Your Mobile Price Is {self.price} \n Manufacturar By {self.manufacturar} \n')
vivo= Mobile('Vivo','v21e',27000)
vivo.manufacturar= "india"
print(vivo.manufacturar)
oppo = Mobile('Oppo','gs5',22000)
oppo.manufacturar= "Bangladesh"
print(oppo.manufacturar)
# আউটপুট এমন আসবে
'''
Your Mobile Name Is Vivo
Your Mobile Model Is v21e
Your Mobile Price Is 27000
Manufacturar By China
india
Your Mobile Name Is Oppo
Your Mobile Model Is gs5
Your Mobile Price Is 22000
Manufacturar By China
Bangladesh
'''
মনেকরি আমরা একটি ক্লাস তৈরী করলাম যখন আমরা অবজেক্ট তৈরী করলাম তখন অবজেক্ট দুইটি একই ক্লাসকে বা আত্মাকে কেন্দ্র করে তৈরী হয়েছে কিন্তু দুইটি অবজেক্ট এর দেহ ভিন্ন। যার কারণে প্রপার্টির ভ্যালু নিজস্ব এবং একটি আরেকটির থেকে সম্পূর্ণ আলাদা।
Change Class Property And Instance Attribute Value By Object Creation
class Person:
country = 'bd'
def __init__(self, name):
self.name = name
p1= Person('olee')
p1.country = 'India' # Change Class Attribute
p1.name = 'Gsm Ashik'
print(p1.country+' '+p1.name)
#OutPut Will Be
'''India Gsm Ashik'''
Access Class attribute Or Instance attribute inside a method
class Person:
country = 'bd'
def __init__(self, name):
self.name = name
def country(ab):
print(f'Your Country Is {ab.name} \n')
def favcolor(args):
args.country= 'India'
print(args.country)
p1= Person('olee')
p1.country()
p1.favcolor()
#output Will Be
'''
Your Country Is olee
India
'''
Method With Parameter And Access With Class Attribute
class Person:
country = 'Bangladesh'
def __init__(self, name):
self.a = name
def hello(args):
print(args.country)
p1= Person('olee')
p1.hello()
#output Will be
''''Bangladesh '''
class Person:
country = 'bd'
def __init__(self, name):
self.name = name
def country(ab,code):
print(f'Your Country Is {ab.name} And your Cofe Is {code} \n')
p1= Person('olee')
p1.country(56)
#Output Will Be
'''
Your Country Is olee And your Cofe Is 56
'''
self কীওয়ার্ড ইন পাইথন OOP:
আমরা কোডের দিকে লক্ষ্য করলে self কীওয়ার্ড দেখতে পাবো কয়েক জায়গায়। যখন আমরা ক্লাসের মধ্যে কোনো মেথড বা ফাংশন কল করবো তখন আমাদের ফাংশনটিতে ডিফল্ট ভাবে একটি প্যারামিটার দিতে হয় যা দিয়ে আমরা এই ক্লাসের প্রপার্টি ও মেথড কে ধরতে পারি। self বাদেও অন্য নামে দেয়া যায়। পাইথন interpreter সেটা নিজে নিজে self হিসাবে গণ্য করে নেয়।যখন init() মেথডের মধ্যে self.a = ‘কিছুএকটা ‘ লিখি তখন সেটা এই ক্লাসের a এট্রিবিউট হিসাবে asign হয়।
class Person:
def __init__(self, name):
self.a = name
p1= Person('olee')
print(p1.a)
#output
''' olee'''
Public And Private Access Modifier
public : যা ক্লাসের বাইরে এবং ভিতরে এক্সেস যোগ্য।
private : যা ক্লাসের শুধুমাত্র ভিতরে এক্সেস যোগ্য।
class Person:
country = 'Bangladesh' # class property/attribute with public access
def __init__(self, name, age):
self.name = name # class property/attribute with public access
self.age = age # class property/attribute with public access
#it Is A Public Method
def hello(self):
print(self.country)
p = Person('olee',25)
print(p.country)
print(p.name)
print(p.age)
p.hello()
#output Will Be Below
'''Bangladesh
olee
25
Bangladesh'''
Private Modifier
When we declare data member as private it means they are accessible only side the class and are inaccessible outside the class.
আমরা এর আগে যে প্র্যাক্টিস করেছি তা সবগুলো পাবলিক মডিফায়ার দ্বারা করা। আমরা যখন আমাদের ক্লাস এর প্রপার্টি বা ক্লাস এট্রিবিউট এবং ক্লাস মেথডকে একসেস মডিফায়ার দিয়ে প্রাইভেট করবো তখন ক্লাস এর বাইরে থেকে ওই অবজেক্ট এর প্রাইভেট প্রপার্টি ভ্যালু ও মেথড কে এক্সেস ও মোডিফাই বা পৰিবৰ্তন করা যাবে না। নিচের কোডটি দেখি
এট্রিবিউট ও মেথড এর নামের শুরুতে _ ডাবল আন্ডারস্কোর দিয়ে প্রাইভেট এট্রিবিউট ও প্রাইভেট মেথড কল করা হয়। কোডটি আমরা পূর্বের মত করে রান করলে আমরা এরর পাবো কারণ এট্রিবিউট ও মেথড এর নামের শুরুতে _ ডাবল আন্ডারস্কোর দিয়ে প্রাইভেট করা হয়েছে।
অবজেক্ট তৈরী করার পর অবজেক্ট._classname__privatevariablename লিখলে privatevariablename এর ভ্যালু পাওয়া যাবে।
class MyClass:
__country = 'Bangladesh'
def __hello(self):
print('hello World')
p1= MyClass()
print(p1._MyClass__country)

