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.
# 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
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
I can eat
My name is Rohu
Yuqoridagi misolda, biz Animal katta klassidan Dog kichik klassini hosil qildik. Quyidagi operatorlarga e'tibor bering,
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.
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,
Bu yerda, Car Vehicledan, Apple Fruitdan meros olishi mumkin va hokazo.
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
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
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.
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,
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
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
# 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
# eat() metodini chaqirish
labrador.eat()
eat() metodining ham qayta belgilangan, ham katta klass versiyasi bajariladi.
Ko'proq bilish uchun, Python super() sahifasiga tashrif buyuring.
Pythonda 5 xil meros olish turi mavjud. Ular:
Ko'proq o'qing: Python Object Oriented Programming, Python Multiple Inheritance