Pythonda Vorislik

Vorislik(Inheritance) Python-da OOPning asosiy tushunchalaridir. Ular kodni tashkil qilish, qayta ishlatish va murakkab tizimlarni modellashtirish uchun kuchli vositalar taqdim etadi.

So'nggi yangilanish: 2024-12-25

Salom, Python ishqibozlari! Bugun biz Python-da Obyektga Yo'naltirilgan Dasturlash (OOP) ning asosiy tushunchalaridan biri - Vorislik haqida chuqur o'rganamiz. Bu kuchli xususiyat bizga klasslar ierarxiyasini yaratish imkonini beradi, bu esa kodni qayta ishlatish va turli klasslar o'rtasida munosabatlar o'rnatishga yordam beradi.

Vorislik nima?

Vorislik - bu bir klass boshqa klassning xususiyatlari va metodlarini o'zlashtirish mexanizmidir. Bu allaqachon aniqlangan klasslardan foydalanib, yangi klasslar yaratish usulidir. Yangi yaratilgan klasslar hosila klasslar (yoki bola klasslar) deb ataladi, ular voris olgan klasslar esa asosiy klasslar (yoki ota klasslar) deb ataladi.

Asosiy Vorislik

Keling, oddiy misol bilan boshlaymiz:

class Hayvon:
    def __init__(self, nomi):
        self.nomi = nomi

    def gapirish(self):
        pass

class It(Hayvon):
    def gapirish(self):
        return f"{self.nomi} Vov! deydi"

class Mushuk(Hayvon):
    def gapirish(self):
        return f"{self.nomi} Myau! deydi"

it = It("Bobik")
mushuk = Mushuk("Mosh")

print(it.gapirish())  # Natija: Bobik Vov! deydi
print(mushuk.gapirish())  # Natija: Mosh Myau! deydi

Bu misolda, It va Mushuk Hayvon asosiy klassidan voris olgan hosila klasslardir.

Vorislik Turlari

Python turli xil vorislik turlarini qo'llab-quvvatlaydi:

1. Yagona Vorislik

Bu vorislikning eng oddiy shakli bo'lib, bunda hosila klass bitta asosiy klassdan voris oladi.

class Ota:
    def metod1(self):
        print("Bu Otadan metod 1")

class Bola(Ota):
    def metod2(self):
        print("Bu Boladan metod 2")

bola = Bola()
bola.metod1()  # Natija: Bu Otadan metod 1
bola.metod2()  # Natija: Bu Boladan metod 2

2. Ko'p Vorislik

Python klassga bir nechta asosiy klasslardan voris olish imkonini beradi.

class Ota:
    def ota_xususiyati(self):
        return "Menda otamning ko'zlari bor"

class Ona:
    def ona_xususiyati(self):
        return "Menda onamning tabassum bor"

class Bola(Ota, Ona):
    pass

bola = Bola()
print(bola.ota_xususiyati())  # Natija: Menda otamning ko'zlari bor
print(bola.ona_xususiyati())  # Natija: Menda onamning tabassum bor

3. Ko'p Darajali Vorislik

Bu hosila klassdan voris olishni o'z ichiga oladi va "buva-ota-bola" munosabatini yaratadi.

class Buva:
    def buva_metodi(self):
        return "Bu Buvadan"

class Ota(Buva):
    def ota_metodi(self):
        return "Bu Otadan"

class Bola(Ota):
    def bola_metodi(self):
        return "Bu Boladan"

bola = Bola()
print(bola.buva_metodi())  # Natija: Bu Buvadan
print(bola.ota_metodi())   # Natija: Bu Otadan
print(bola.bola_metodi())  # Natija: Bu Boladan

super() Funksiyasi

super() funksiyasi ota klassning metodlarini chaqirish uchun ishlatiladi. Bu ayniqsa meros olingan metodning funksionalligini kengaytirmoqchi bo'lganingizda foydalidir.

class Hayvon:
    def __init__(self, nomi):
        self.nomi = nomi

class It(Hayvon):
    def __init__(self, nomi, zoti):
        super().__init__(nomi)
        self.zoti = zoti

    def malumot(self):
        return f"{self.nomi} {self.zoti} zotli it"

it = It("Bobik", "Buldog")
print(it.malumot())  # Natija: Bobik Buldog zotli it

Metodni Qayta Yozish

Metodni qayta yozish hosila klass o'zining asosiy klassidagi metod bilan bir xil nomli metodini aniqlagan paytda sodir bo'ladi.

class Transport:
    def tavsif(self):
        return "Bu transport vositasi"

class Avtomobil(Transport):
    def tavsif(self):  # Bu Transport.tavsif() ni qayta yozadi
        return "Bu avtomobil"

transport = Transport()
avtomobil = Avtomobil()

print(transport.tavsif())  # Natija: Bu transport vositasi
print(avtomobil.tavsif())  # Natija: Bu avtomobil

Abstrakt Asosiy Klasslar

Abstrakt Asosiy Klasslar (AAK) - bu voris olish uchun mo'ljallangan, lekin to'g'ridan-to'g'ri yaratilmaydigan klasslardir. Ular interfeyslarni aniqlash uchun foydalidir.

from abc import ABC, abstractmethod

class Shakl(ABC):
    @abstractmethod
    def maydon(self):
        pass

class Kvadrat(Shakl):
    def __init__(self, tomon):
        self.tomon = tomon

    def maydon(self):
        return self.tomon ** 2

# kvadrat = Shakl()  # Bu TypeError chaqiradi
kvadrat = Kvadrat(5)
print(kvadrat.maydon())  # Natija: 25

Amaliy Misol: Kutubxona Tizimini Yaratish

Keling, vorislikni amalda ko'rsatish uchun murakkabroq misol yarataylik:

class KutubxonaElementi:
    def __init__(self, nomi, muallif, element_id):
        self.nomi = nomi
        self.muallif = muallif
        self.element_id = element_id
        self.olingan = False

    def olish(self):
        if not self.olingan:
            self.olingan = True
            return f"{self.nomi} olib ketildi"
        return f"{self.nomi} allaqachon olib ketilgan"

    def qaytarish(self):
        if self.olingan:
            self.olingan = False
            return f"{self.nomi} qaytarildi"
        return f"{self.nomi} olib ketilmagan"

class Kitob(KutubxonaElementi):
    def __init__(self, nomi, muallif, element_id, sahifalar):
        super().__init__(nomi, muallif, element_id)
        self.sahifalar = sahifalar

    def malumot(self):
        return f"Kitob: {self.nomi}, muallif {self.muallif}, {self.sahifalar} sahifa"

class DVD(KutubxonaElementi):
    def __init__(self, nomi, rejissor, element_id, davomiyligi):
        super().__init__(nomi, rejissor, element_id)
        self.davomiyligi = davomiyligi

    def malumot(self):
        return f"DVD: {self.nomi}, rejissor {self.muallif}, {self.davomiyligi} daqiqa"

# Klasslardan foydalanish
kitob = Kitob("O'tgan kunlar", "Abdulla Qodiriy", "K001", 328)
dvd = DVD("Mahallada duv-duv gap", "Zulfikar Musakov", "D001", 90)

print(kitob.malumot())
print(dvd.malumot())
print(kitob.olish())
print(kitob.olish())
print(kitob.qaytarish())
print(dvd.olish())

# Natija:
# Kitob: O'tgan kunlar, muallif Abdulla Qodiriy, 328 sahifa
# DVD: Mahallada duv-duv gap, rejissor Zulfikar Musakov, 90 daqiqa
# O'tgan kunlar olib ketildi
# O'tgan kunlar allaqachon olib ketilgan
# O'tgan kunlar qaytarildi
# Mahallada duv-duv gap olib ketildi

Bu misol vorislikdan foydalanib, moslashuvchan va kengaytiriladigan kutubxona tizimini qanday yaratish mumkinligini ko'rsatadi.

Tez-tez So'raladigan Savollar (TSS)

  1. S: Vorislik va kompozitsiya o'rtasidagi farq nima? J: Vorislik klasslar o'rtasida "bu" munosabatini o'rnatadi, kompozitsiya esa "ega" munosabatini o'rnatadi. Masalan, Avtomobil "bu" Transport (vorislik), lekin Avtomobil "ega" Dvigatelga (kompozitsiya).
  2. S: Python-da klass bir nechta klasslardan voris ola oladimi? J: Ha, Python ko'p vorislikni qo'llab-quvvatlaydi. Klass bir nechta asosiy klasslardan voris olishi mumkin.
  3. S: Python-da Metod Hal Qilish Tartibi (MHT) nima? J: MHT - bu Python klasslar ierarxiyasida metodlar va atributlarni qidirish tartibidir. Bu ayniqsa ko'p vorislik holatlarida muhimdir. Klassning MHT-sini __mro__ atributi yoki mro() metodi yordamida ko'rish mumkin.
  4. S: Ko'p vorislikda super() funksiyasi qanday ishlaydi? J: Ko'p vorislikda super() qaysi super klassning metodini chaqirishni aniqlash uchun Metod Hal Qilish Tartibiga (MHT) amal qiladi.
  5. S: Vorislikdagi olmos muammosi nima? J: Olmos muammosi ko'p vorislikda, klass umumiy ajdodga ega bo'lgan ikkita klassdan voris olgan paytda yuzaga keladi. Python buni MHT-ni aniqlash uchun C3 linearizatsiya algoritmidan foydalanib hal qiladi.
  6. S: Python-da o'rnatilgan metodlarni qayta yozish mumkinmi? J: Ha, Python-da o'rnatilgan metodlarni qayta yozish mumkin. Masalan, __str__, __repr__, __len__ va boshqalarni o'z klassingiz uchun moslashtirish uchun qayta yozishingiz mumkin.
  7. S: Vorislikda @classmethod va @staticmethod o'rtasidagi farq nima? J: @classmethod klassni yashirin birinchi argument sifatida qabul qiladi va klass holatiga kirish va uni o'zgartirish mumkin. @staticmethod esa, aksincha, hech qanday yashirin birinchi argumentni qabul qilmaydi va klass ichida aniqlangan oddiy funksiya kabi ishlaydi.
  8. S: Metodning hosila klassda qayta yozilishini qanday oldini olish mumkin? J: Python-da metodlarni qayta yozishni oldini olishning o'rnatilgan usuli yo'q. Biroq, nomlash konventsiyalaridan foydalanish (masalan, ikki pastki chiziq bilan boshlash) metodlarni tasodifan qayta yozishni qiyinlashtirishi mumkin.
  9. S: O'rdak tipizatsiyasi nima va u vorislik bilan qanday bog'liq? J: O'rdak tipizatsiyasi - bu obyektning turi yoki klassi uning aniqlagan metodlaridan kamroq ahamiyatga ega bo'lgan tushuncha. U ko'pincha Python-da polimorfizmga erishish uchun vorislikka muqobil sifatida ishlatiladi.
  10. S: Python-da abstrakt metodlar amalga oshirilishi mumkinmi? J: Ha, Python-da abstrakt metodlar standart amalga oshirishga ega bo'lishi mumkin. Hosila klasslar bu amalga oshirishni qayta yozishlari yoki abstrakt asosiy klass tomonidan taqdim etilgan standart variantdan foydalanishlari mumkin.

Xulosa

Vorislik - bu Python-da kodni qayta ishlatish va murakkab klass ierarxiyalarini yaratish imkonini beruvchi kuchli xususiyatdir. Vorislikni tushunish va to'g'ri foydalanish orqali siz yanada samarali, tartibli va saqlanishi oson kod yozishingiz mumkin. Vorislikdan oqilona foydalanishni va kerak bo'lganda kompozitsiyani ham hisobga olishni unutmang.

Qo'shimcha Manbalar

  1. Python Rasmiy Hujjatlari - Vorislik
  2. Real Python - Vorislik va Kompozitsiya: Python OOP Qo'llanmasi
  3. Python Tips - Python MHT-ni Tushunish