34 / 59

Python Inheritance

Meros olish (Inheritance) bilan tanishish

Ob'ektga yo'naltirilgan til bo'lgani uchun, Python klass merosini qo'llab-quvvatlaydi. Bu bizga mavjud klassdan yangi klass yaratish imkonini beradi.

Yangi yaratilgan klass kichik klass (subclass, farzand yoki hosila klass) deb ataladi. Farzand klass meros oladigan mavjud klass esa katta klass (superclass, ota yoki asosiy klass) deb ataladi.

Python meros olish sintaksisi

example.py
# katta klassni aniqlash
class super_class:
    # atributlar va metod e'loni

# meros olish
class sub_class(super_class):
    # super_class'ning atributlari va metodi
    # sub_class'ning atributlari va metodi

Bu yerda, biz sub_classni super_classdan meros olyapmiz.

Eslatma: Meros olish bilan davom etishdan oldin, Python klasslari va obyektlari qanday ishlashini bilishingizga ishonch hosil qiling.

Misol: Python meros olish

example.py
class Animal:

    # ota klassning atributi va metodi
    name = ""
    
    def eat(self):
        print("I can eat")

# Animal'dan meros olish
class Dog(Animal):

    # kichik klassdagi yangi metod
    def display(self):
        # self yordamida katta klassning name atributiga murojaat qilish
        print("My name is ", self.name)

# kichik klassning obyektini yaratish
labrador = Dog()

# katta klass atributi va metodiga murojaat qilish 
labrador.name = "Rohu"
labrador.eat()

# kichik klass metodini chaqirish 
labrador.display()

Natija

kod
I can eat
My name is  Rohu

Yuqoridagi misolda, biz Animal katta klassidan Dog kichik klassini hosil qildik. Quyidagi operatorlarga e'tibor bering,

example.py
labrador.name = "Rohu"

labrador.eat()

Bu yerda, biz Animal klassining name va eat()iga murojaat qilish uchun labradordan (Dogning obyekti) foydalanyapmiz.

Bu mumkin, chunki kichik klass katta klassning barcha atributlari va metodlarini meros oladi.

Shuningdek, biz Dog klassining metodi ichida name atributiga self yordamida murojaat qildik.

Python meros olishni amalga oshirish

is-a munosabati

Meros olish — is-a (bu — ...) munosabati. Ya'ni, biz meros olishdan faqat ikkita klass orasida is-a munosabati mavjud bo'lsagina foydalanamiz. Masalan,

  • Car (mashina) — Vehicle (transport vositasi)
  • Apple (olma) — Fruit (meva)
  • Cat (mushuk) — Animal (hayvon)

Bu yerda, Car Vehicledan, Apple Fruitdan meros olishi mumkin va hokazo.

Python meros olishda metodni qayta belgilash (Method Overriding)

Oldingi misolda, biz kichik klassning obyekti katta klassning metodiga murojaat qila olishini ko'rdik.

Biroq, agar bir xil metod ham katta klassda, ham kichik klassda mavjud bo'lsa-chi?

Bu holatda, kichik klassdagi metod katta klassdagi metodni qayta belgilaydi (override). Bu tushuncha Pythonda metodni qayta belgilash (method overriding) deb ataladi.

Misol: Metodni qayta belgilash

example.py
class Animal:

    # ota klassning atributlari va metodi
    name = ""
    
    def eat(self):
        print("I can eat")

# Animal'dan meros olish
class Dog(Animal):

    # eat() metodini qayta belgilash
    def eat(self):
        print("I like to eat bones")

# kichik klassning obyektini yaratish
labrador = Dog()

# labrador obyektida eat() metodini chaqirish
labrador.eat()

Natija

kod
I like to eat bones

Yuqoridagi misolda, bir xil eat() metodi ham Dog klassida, ham Animal klassida mavjud.

Endi, Dog kichik klassining obyekti yordamida eat() metodini chaqirganimizda, Dog klassining metodi chaqiriladi.

Buning sababi, Dog kichik klassining eat() metodi Animal katta klassining xuddi shu metodini qayta belgilaydi.

Meros olishda super() funksiyasi

Ilgari biz kichik klassdagi bir xil metod (funksiya) katta klassdagi metodni qayta belgilashini ko'rdik.

Biroq, agar bizga kichik klassdan katta klass metodiga murojaat qilish kerak bo'lsa, super() funksiyasidan foydalanamiz. Masalan,

example.py
class Animal:

    name = ""
    
    def eat(self):
        print("I can eat")

# Animal'dan meros olish
class Dog(Animal):
    
    # eat() metodini qayta belgilash
    def eat(self):
        
        # super() yordamida katta klassning eat() metodini chaqirish
        super().eat()
        
        print("I like to eat bones")

# kichik klassning obyektini yaratish
labrador = Dog()

labrador.eat()

Natija

kod
I can eat
I like to eat bones

Yuqoridagi misolda, Dog kichik klassining eat() metodi Animal katta klassining xuddi shu metodini qayta belgilaydi.

Dog klassi ichida, biz

example.py
# katta klass metodini chaqirish
super().eat()

Dog kichik klassidan Animal katta klassining eat() metodini chaqirish uchun ishlatdik.

Shunday qilib, labrador obyekti yordamida eat() metodini chaqirganimizda

example.py
# eat() metodini chaqirish
labrador.eat()

eat() metodining ham qayta belgilangan, ham katta klass versiyasi bajariladi.

Ko'proq bilish uchun, Python super() sahifasiga tashrif buyuring.

Meros olish turlari

Pythonda 5 xil meros olish turi mavjud. Ular:

  • Single Inheritance (Yagona meros olish): farzand klass faqat bitta ota klassdan meros oladi.
  • Multiple Inheritance (Ko'p meros olish): farzand klass bir nechta ota klassdan meros oladi.
  • Multilevel Inheritance (Ko'p darajali meros olish): farzand klass o'zining ota klassidan meros oladi, u esa o'z navbatida o'zining ota klassidan meros oladi.
  • Hierarchical Inheritance (Ierarxik meros olish): bitta ota klassdan bir nechta farzand klass yaratiladi.
  • Hybrid Inheritance (Aralash meros olish): bir nechta meros olish shaklini birlashtiradi.

Meros olishning qo'llanilishi

  • Kodni qayta ishlatish: Farzand klass ota klassning barcha funksionalligini meros olishi mumkinligi sababli, bu kodni qayta ishlatish imkonini beradi.
  • Samarali ishlab chiqish: Bir marta funksionallik ishlab chiqilgandan so'ng, biz shunchaki uni meros olishimiz mumkin, bu esa tozaroq kod va oson parvarishga imkon beradi.
  • Moslashtirish: Farzand klassga o'zimizning funksionalligimizni ham qo'sha olganimiz uchun, biz faqat foydali funksionallikni meros olib, boshqa kerakli xususiyatlarni belgilashimiz mumkin.

Ko'proq o'qing: Python Object Oriented Programming, Python Multiple Inheritance

QBilimingizni sinab ko'ring
1 / 3

1. Kichik klass (subclass) va katta klass (superclass) orasidagi munosabat qanday nomlanadi?