Ko'p meros olish (Multiple Inheritance) bilan tanishish
Pythonda klass bir nechta katta klassdan hosil qilinishi mumkin. Bu ko'p meros olish (multiple inheritance) deb ataladi.
Masalan, Bat klassi Mammal va WingedAnimal katta klasslaridan hosil qilinadi. Bu mantiqan to'g'ri, chunki ko'rshapalak ham sut emizuvchi (mammal), ham qanotli hayvon (winged animal).
Ko'p meros olish

class SuperClass1:
# SuperClass1'ning xususiyatlari
class SuperClass2:
# SuperClass2'ning xususiyatlari
class MultiDerived(SuperClass1, SuperClass2):
# SuperClass1 + SuperClass2 + MultiDerived klassining xususiyatlari
Bu yerda, MultiDerived klassi SuperClass1 va SuperClass2 klasslaridan hosil qilingan.
Misol: Python ko'p meros olish
class Mammal:
def mammal_info(self):
print("Mammals can give direct birth.")
class WingedAnimal:
def winged_animal_info(self):
print("Winged animals can flap.")
class Bat(Mammal, WingedAnimal):
pass
# Bat klassining obyektini yaratish
b1 = Bat()
b1.mammal_info()
b1.winged_animal_info()
Natija
Mammals can give direct birth.
Winged animals can flap.
Yuqoridagi misolda, Bat klassi ikkita katta klassdan hosil qilingan: Mammal va WingedAnimal. Quyidagi operatorlarga e'tibor bering,
b1 = Bat()
b1.mammal_info()
b1.winged_animal_info()
Bu yerda, biz mos ravishda Mammal va WingedAnimal klasslarining mammal_info() va winged_animal_info() metodlariga murojaat qilish uchun b1dan (Batning obyekti) foydalanyapmiz.
Pythonda, biz nafaqat katta klassdan klass hosil qila olamiz, balki hosila klassdan ham klass hosil qila olamiz. Bu meros olish shakli ko'p darajali meros olish (multilevel inheritance) deb ataladi.
Mana ko'p darajali meros olishning sintaksisi,
class SuperClass:
# Katta klass kodi shu yerda
class DerivedClass1(SuperClass):
# 1-hosila klass kodi shu yerda
class DerivedClass2(DerivedClass1):
# 2-hosila klass kodi shu yerda
Bu yerda, DerivedClass1 klassi SuperClassdan, DerivedClass2 klassi esa DerivedClass1dan hosil qilingan.
Pythonda ko'p darajali meros olish

Misol: Python ko'p darajali meros olish
class SuperClass:
def super_method(self):
print("Super Class method called")
# SuperClass'dan hosil qiluvchi klassni aniqlash
class DerivedClass1(SuperClass):
def derived1_method(self):
print("Derived class 1 method called")
# DerivedClass1'dan hosil qiluvchi klassni aniqlash
class DerivedClass2(DerivedClass1):
def derived2_method(self):
print("Derived class 2 method called")
# DerivedClass2'ning obyektini yaratish
d2 = DerivedClass2()
d2.super_method() # Natija: "Super Class method called"
d2.derived1_method() # Natija: "Derived class 1 method called"
d2.derived2_method() # Natija: "Derived class 2 method called"
Natija
Super Class method called
Derived class 1 method called
Derived class 2 method called
Yuqoridagi misolda, DerivedClass2 DerivedClass1dan hosil qilingan, u esa SuperClassdan hosil qilingan.
Bu shuni anglatadiki, DerivedClass2 ham DerivedClass1ning, ham SuperClassning barcha atribut va metodlarini meros oladi.
Shuning uchun, biz SuperClass, DerivedClass1 va DerivedClass2dan metodlarni chaqirish uchun d2dan (DerivedClass2ning obyekti) foydalanyapmiz.
Agar ikkita katta klass bir xil nomli metodga (funksiyaga) ega bo'lsa va hosila klass o'sha metodni chaqirsa, Python qaysi metodni chaqirishni aniqlash uchun MRO'dan foydalanadi. Masalan,
class SuperClass1:
def info(self):
print("Super Class 1 method called")
class SuperClass2:
def info(self):
print("Super Class 2 method called")
class Derived(SuperClass1, SuperClass2):
pass
d1 = Derived()
d1.info()
# Natija: "Super Class 1 method called"
Bu yerda, SuperClass1 va SuperClass2 klasslarining ikkalasi ham info() metodini aniqlaydi.
Shuning uchun, Derived klassining d1 obyekti yordamida info() chaqirilganda, Python qaysi metodni chaqirishni aniqlash uchun MRO'dan foydalanadi.
Bu holatda, MRO metodlar birinchi navbatda eng chapdagi katta klassdan meros olinishi kerakligini belgilaydi, shuning uchun SuperClass2nikidan emas, balki SuperClass1ning info()si chaqiriladi.
Ko'proq o'qing: Python Object Oriented Programming, Polymorphism in Python, self in Python, Demystified