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-25Salom, 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)
- 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).
- 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.
- 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 yokimro()
metodi yordamida ko'rish mumkin. - S: Ko'p vorislikda
super()
funksiyasi qanday ishlaydi? J: Ko'p vorislikdasuper()
qaysi super klassning metodini chaqirishni aniqlash uchun Metod Hal Qilish Tartibiga (MHT) amal qiladi. - 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.
- 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. - 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. - 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.
- 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.
- 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.