Barcha kurslar Yo'nalishlar Reyting Kirish Ro'yxatdan o'tish

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 Python self o'rniga alini o'zi qo'yadi.
  • ali va valimustaqil obyektlar: bitta qolipdan yasalgan, lekin har birining o'z ismi, o'z balli 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

  1. Mashina klassi: marka, yil atributlari, malumot() metodi. Ikki obyekt yaratib, ikkalasini chiqaring.
  2. Talabaga ballar ro'yxatini qo'shing; ortacha() metodi o'rtachani qaytarsin, bahola() shu o'rtachaga tayansin.
  3. Mashinadan ElektroMashinani voris qiling: zaryad atributi, super() bilan __init__, qayta aniqlangan malumot().
  4. Kitobga __str__ va __len__ yozing; ikkala dunderni ishlatib ko'rsating.
  5. Hisob klassini kengaytiring: yechish(summa) metodi balansdan ortiq yechishga yo'l qo'ymasin.
  6. (Qo'shimcha) Ikki Kitobni __eq__ bilan taqqoslang; keyin __lt__ yozib, kitoblar ro'yxatini sorted() bilan sahifasi bo'yicha saralang.

OOP — kursning eng katta mavzusi; bo'lim testi bilan mustahkamlang.

OOP — konspekt

Obyektga yo'naltirilgan dasturlash (OOP) Maqola

Klass, obyekt, vorislik, inkapsulyatsiya va dunder metodlar — bir sahifada.

Eslatma yozish uchun saytga kiring.

Resurslar hozircha qo'shilmagan

O'qituvchi dars uchun qo'shimcha materiallarni qo'shganida shu yerda paydo bo'ladi.

Savol berish uchun saytga kiring.

Hozircha savollar yo'q

Bu dars yuzasidan birinchi savolni siz bering.