Bu bo'limda dasturlashning yangi darajasi — obyektga yo'naltirilgan dasturlash (OOP) o'rganildi: klass va obyekt, __init__ va self, vorislik, inkapsulyatsiya va dunder metodlar.
Nega OOP kerak
Talabalar ro'yxati bilan ishlaydigan dastur tasavvur qiling: har talabaning ismi, ballari bor; ularni baholaydigan, taqqoslaydigan funksiyalar bor. Ma'lumot bir joyda (lug'atlar), amallar boshqa joyda (funksiyalar) yashasa, dastur o'sgani sari ular orasidagi bog' yo'qola boradi.
OOP ikkalasini birlashtiradi: klass — ma'lumot (atributlar) va amallar (metodlar)ning yagona qolipi; obyekt — shu qolipdan yasalgan konkret nusxa.
Klass, obyekt, init, self
class Talaba:
def __init__(self, ism, ball):
self.ism = ism
self.ball = ball
def bahola(self):
if self.ball >= 90:
return f"{self.ism}: a'lo"
return f"{self.ism}: yaxshi"
ali = Talaba("Ali", 95)
vali = Talaba("Vali", 78)
print(ali.bahola())
print(vali.bahola())
print(ali.ball)
Natija:
Ali: a'lo
Vali: yaxshi
95
Uchta tayanch tushuncha:
__init__— obyekt yaratilganda (Talaba("Ali", 95)) avtomatik chaqiriladigan metod; boshlang'ich qiymatlar shu yerda o'rnatiladi. Nomi ikki tomondan ikki pastki chiziq bilan yoziladi.self— obyektning o'zi. Har metodning birinchi parametri, lekin chaqirishda yozilmaydi:ali.bahola()deganda Pythonselfo'rnigaalini o'zi qo'yadi.alivavali— mustaqil obyektlar: bitta qolipdan yasalgan, lekin har birining o'zismi, o'zballi bor.
Tipik xato — metod ichida selfsiz murojaat:
def bahola(self):
return ism # self.ism bo'lishi kerak edi
Natija:
NameError: name 'ism' is not defined
Obyekt atributi har doim self. bilan: self.ism, self.ball.
Vorislik: mavjud klass asosida yangisi
Yangi klass eskisining hamma imkoniyatlarini olib, o'zinikini qo'shadi:
class Magistrant(Talaba): # Talaba'dan meros oladi
def __init__(self, ism, ball, mavzu):
super().__init__(ism, ball) # ota klass __init__ ini chaqiramiz
self.mavzu = mavzu
def bahola(self): # metodni QAYTA ANIQLASH (override)
return f"{self.ism} ({self.mavzu}): {self.ball} ball"
m = Magistrant("Olim", 88, "Sun'iy intellekt")
print(m.bahola())
Natija:
Olim (Sun'iy intellekt): 88 ball
super()— ota klassga murojaat: ism-ball o'rnatish kodini qayta yozmadik.- Bir xil nomli metod har klassda o'zicha ishlashi — polimorfizm:
bahola()chaqirilganda kim chaqirayotganiga qarab kerakli versiya ishlaydi.
Vorislik "X — bu maxsus Y" munosabatida ishlatiladi: Magistrant — bu Talaba; ElektroMashina — bu Mashina.
Inkapsulyatsiya va klass atributlari
Inkapsulyatsiya — obyekt ichki holatini to'g'ridan-to'g'ri emas, metodlar orqali o'zgartirish tamoyili. Python'da _ prefiks "bu ichki atribut, bevosita tegmang" degan kelishuv:
class Hisob:
def __init__(self):
self._balans = 0
def qoshish(self, summa):
if summa <= 0:
return "Summa musbat bo'lishi kerak"
self._balans += summa
return f"Balans: {self._balans}"
h = Hisob()
print(h.qoshish(50000))
print(h.qoshish(-100))
Natija:
Balans: 50000
Summa musbat bo'lishi kerak
Holat faqat metod orqali o'zgargani uchun manfiy summa bitta joyda to'sildi — to'g'ridan-to'g'ri h._balans = -100 yozishga esa kelishuv yo'l qo'ymaydi.
Klass atributi — barcha obyektlarga umumiy qiymat; obyekt atributidan farqli, klass darajasida e'lon qilinadi:
class Talaba:
universitet = "TATU" # hammaga bitta
def __init__(self, ism):
self.ism = ism # har kimga o'ziniki
Dunder metodlar
Ikki pastki chiziqli metodlar obyektni Python'ning tabiiy amallariga "o'rgatadi":
class Kitob:
def __init__(self, nom, sahifa):
self.nom = nom
self.sahifa = sahifa
def __str__(self):
return f"Kitob: {self.nom} ({self.sahifa} bet)"
def __len__(self):
return self.sahifa
def __eq__(self, boshqa):
return self.nom == boshqa.nom
k1 = Kitob("Python asoslari", 350)
k2 = Kitob("Python asoslari", 200)
print(k1) # __str__
print(len(k1)) # __len__
print(k1 == k2) # __eq__ (nom bo'yicha)
Natija:
Kitob: Python asoslari (350 bet)
350
True
__str__siz print(k1) nima berardi? <__main__.Kitob object at 0x7f...> — foydasiz manzil. Shu oila davomi: __repr__ (texnik ko'rinish), __lt__ (< — saralashda ishlaydi), __add__ (+) va boshqalar.
Eslab qoling
- Klass — qolip; obyekt — nusxa;
__init__yaratishda avtomatik ishlaydi. - Atributga metod ichida faqat
self.orqali murojaat qilinadi. - Vorislik:
class Bola(Ota);super()— ota kodini qayta ishlatish; override — polimorfizm. _atribut— "ichki, tegmang"; holat metodlar orqali o'zgarsin.__str__,__len__,__eq__— obyektni print/len/== bilan ishlashga o'rgatadi.
Amaliyot
Mashinaklassi:marka,yilatributlari,malumot()metodi. Ikki obyekt yaratib, ikkalasini chiqaring.Talabaga ballar ro'yxatini qo'shing;ortacha()metodi o'rtachani qaytarsin,bahola()shu o'rtachaga tayansin.MashinadanElektroMashinani voris qiling:zaryadatributi,super()bilan__init__, qayta aniqlanganmalumot().Kitobga__str__va__len__yozing; ikkala dunderni ishlatib ko'rsating.Hisobklassini kengaytiring:yechish(summa)metodi balansdan ortiq yechishga yo'l qo'ymasin.- (Qo'shimcha) Ikki
Kitobni__eq__bilan taqqoslang; keyin__lt__yozib, kitoblar ro'yxatinisorted()bilan sahifasi bo'yicha saralang.
OOP — kursning eng katta mavzusi; bo'lim testi bilan mustahkamlang.