Python'da Obyektga Yo'naltirilgan Dasturlash (OOP) Asoslari
OOP Nima?
Obyektga Yo'naltirilgan Dasturlash (OOP) - bu dasturlash paradigmasi bo'lib, unda ma'lumotlar va ular bilan bog'liq operatsiyalar obyektlar shaklida tashkil etiladi. Obyektlar real dunyo ob'ektlarini modellashtiradi (masalan, mashina, talaba, hayvon). OOP Python'da kodni tuzilgan, qayta ishlatiladigan va oson boshqariladigan qilish uchun ishlatiladi.
OOPning asosiy afzalliklari:
- Modullilik: Kodni alohida sinflarga ajratish oson boshqarish imkonini beradi.
- Qayta ishlatish: Bir sinfni turli loyihalarda ishlatish mumkin.
- Kengaytirish: Meros (inheritance) yordamida yangi funksiyalarni qo'shish oson.
- Abstraksiya: Murakkab jarayonlarni soddalashtiradi.
Python'da OOPning asosiy tushunchalari: sinflar, obyektlar, inkapsulyatsiya, meros va polimorfizm.
Sinflar va Obyektlar
Sinf (Class) Nima?
Sinf - bu obyektlar uchun shablon yoki loyiha. U obyektning xususiyatlari (ma'lumotlari) va xatti-harakatlarini (metodlarini) ta'riflaydi. Masalan, "Talaba" sinfi talabaning ismi, yoshi va baholarini saqlashi mumkin.
Sinfni ta'riflash uchun class keywordi ishlatiladi:
class Talaba:
def __init__(self, ism, yosh):
self.ism = ism # Xususiyat (attribute)
self.yosh = yosh
def malumot(self): # Metod
return f"Ism: {self.ism}, Yosh: {self.yosh}"class: Sinfni ta'riflash uchun ishlatiladi.__init__: Konstruktor metodi, obyekt yaratilganda avtomatik chaqiriladi.self: Obyektning o'ziga ishora qiladi, har bir metodda birinchi parametr sifatida ishlatiladi.ism,yosh: Obyektning xususiyatlari (atributlari).
Obyekt (Object) Nima?
Obyekt - bu sinfning namunasi (instance). Sinf shablon bo'lsa, obyekt uning haqiqiy ko'rinishi. Masalan, "Talaba" sinfidan "Ali" yoki "Vali" nomli talaba obyektlari yaratiladi.
# Obyekt yaratish
talaba1 = Talaba("Ali", 20)
talaba2 = Talaba("Vali", 22)
# Metodni chaqirish
print(talaba1.malumot()) # Chiqish: Ism: Ali, Yosh: 20
print(talaba2.malumot()) # Chiqish: Ism: Vali, Yosh: 22Inkapsulyatsiya (Encapsulation)
Inkapsulyatsiya - ma'lumotlarni sinf ichida yashirish va ularga faqat maxsus metodlar orqali kirish imkonini berish. Bu ma'lumotlarning xavfsizligini ta'minlaydi. Python'da inkapsulyatsiya protected va private xususiyatlar bilan amalga oshiriladi:
- Protected: Bir pastki chiziq (
_) bilan boshlanadi, masalan_ism. Bu xususiyatni tashqaridan o'zgartirish tavsiya etilmaydi. - Private: Ikki pastki chiziq (
__) bilan boshlanadi, masalan__ism. Bu xususiyatga tashqaridan to'g'ridan-to'g'ri kirish mumkin emas.
Misol:
class Talaba:
def __init__(self, ism, yosh):
self._ism = ism # Protected
self.__yosh = yosh # Private
def get_yosh(self): # Getter metod
return self.__yosh
def set_yosh(self, yangi_yosh): # Setter metod
if yangi_yosh > 0:
self.__yosh = yangi_yosh
talaba = Talaba("Ali", 20)
print(talaba._ism) # Chiqish: Ali
# print(talaba.__yosh) # Xato: __yosh private
print(talaba.get_yosh()) # Chiqish: 20
talaba.set_yosh(21)
print(talaba.get_yosh()) # Chiqish: 21Meros (Inheritance)
Meros sinflarga boshqa sinfning xususiyatlari va metodlarini olish imkonini beradi. Bu kodni qayta ishlatishni osonlashtiradi.
Misol: "Talaba" sinfidan "Magistr" sinfini meros qilib olish.
class Talaba:
def __init__(self, ism, yosh):
self.ism = ism
self.yosh = yosh
def malumot(self):
return f"Ism: {self.ism}, Yosh: {self.yosh}"
class Magistr(Talaba): # Meros olish
def __init__(self, ism, yosh, mutaxassislik):
super().__init__(ism, yosh) # Ota sinf konstruktori
self.mutaxassislik = mutaxassislik
def malumot(self): # Metodni qayta ta'riflash (override)
return f"{super().malumot()}, Mutaxassislik: {self.mutaxassislik}"
magistr = Magistr("Olim", 25, "Informatika")
print(magistr.malumot()) # Chiqish: Ism: Olim, Yosh: 25, Mutaxassislik: Informatikasuper(): Ota sinf metodlarini chaqirish uchun ishlatiladi.- Metodni qayta ta'riflash (override): Bol sinf ota sinf metodini o'zgartirishi mumkin.
Polimorfizm (Polymorphism)
Polimorfizm bir xil nomdagi metodlarning turli sinflarda turli xil tarzda ishlashini anglatadi. Yuqoridagi misolda malumot metodi Talaba va Magistr sinflarida turlicha ishlaydi.
Boshqa misol:
class Hayvon:
def ovoz(self):
pass
class It(Hayvon):
def ovoz(self):
return "Vov-vov!"
class Mushuk(Hayvon):
def ovoz(self):
return "Myau!"
hayvonlar = [It(), Mushuk()]
for hayvon in hayvonlar:
print(hayvon.ovoz()) # Chiqish: Vov-vov! \n Myau!Statik Metodlar va Sinf Metodlari
- Statik Metodlar:
selfparametriga ega emas va sinf bilan bog'lanmagan.@staticmethoddekoratori bilan ta'riflanadi. - Sinf Metodlari: Sinf bilan bog'langan va
clsparametrini oladi.@classmethoddekoratori bilan ta'riflanadi.
Misol:
class Kalkulyator:
@staticmethod
def qoshish(a, b):
return a + b
@classmethod
def info(cls):
return "Bu Kalkulyator sinfi"
print(Kalkulyator.qoshish(5, 3)) # Chiqish: 8
print(Kalkulyator.info()) # Chiqish: Bu Kalkulyator sinfiAmaliy Masalalar
- Misol 1: Mashina sinfini yarating, unda model, yil va tezlik xususiyatlari bo'lsin. Tezlikni oshirish va kamaytirish metodlarini qo'shing.
class Mashina:
def __init__(self, model, yil):
self.model = model
self.yil = yil
self.tezlik = 0
def tezlashtir(self, oshirish):
self.tezlik += oshirish
return self.tezlik
def sekinlashtir(self, kamaytirish):
self.tezlik = max(0, self.tezlik - kamaytirish)
return self.tezlik
mashina = Mashina("BMW", 2020)
print(mashina.tezlashtir(50)) # Chiqish: 50
print(mashina.sekinlashtir(20)) # Chiqish: 30- Misol 2: "Kitob" sinfini yarating, unda nom, muallif va narx xususiyatlari bo'lsin. Narxga chegirma qo'llovchi metod qo'shing.
class Kitob:
def __init__(self, nom, muallif, narx):
self.nom = nom
self.muallif = muallif
self.narx = narx
def chegirma(self, foiz):
self.narx = self.narx * (1 - foiz / 100)
return self.narx
kitob = Kitob("Python", "Guido", 100)
print(kitob.chegirma(20)) # Chiqish: 80.0Maslahatlar
- Sinf nomlari odatda
CamelCaseuslubida yoziladi (masalan,Talaba,Mashina). - Metod va atribut nomlari
snake_caseus