6.1 İrsiyyət — bu sadədir
İrsiyyət — obyekt yönümlü proqramlaşdırmanın (OOP) əsas konsepsiyalarından biridir və bir sinfə (uşaq və ya subclass adlanan) digər bir sinfin (valideyn və ya superclass adlanan) sahələrini və metodlarını miras almağa imkan verir.

Belə yanaşma daha ümumi siniflər yaratmağı və kodu təkrar istifadə etməyi mümkün edir, bu da kodun təşkilatını və dəstəklənməsini daha da yaxşılaşdırır.
İrsiyyət nə üçün lazımdır?
Tutaq ki, hansısa kod yazmaq lazımdır və siz bunu bir sinif şəklində etmək qərarına gəlmisiniz. Sonra öyrənirsiniz ki, layihənizdə artıq sizə lazımlı funksiyaların əksəriyyətini yerinə yetirən bir sinif mövcuddur. Onda sadəcə həmin sinifin kodunu özünüzünkünə kopyalayıb istifadə edə bilərsiniz.
Amma siz “kopyalamağa bənzər” bir şey edə bilərsiniz. Uşağınızın sinifinə həmin sinifi valideyn elan edə bilərsiniz və o zaman Python sizin sinifə valideyn sinifin davranışını əlavə edəcək.
Təsəvvür edin ki, siz təbiətsiniz və İt yaratmaq istəyirsiniz. Nə daha tez olacaq — bakteriyadan iti yaratmaq üçün milyard il vaxt xərcləmək, yoxsa 200 min ildə canavarı əhilləşdirmək?
İrsiyyətin sadə bir nümunəsi
Tutaq ki, Animal
adlı valideyn sinifiniz var və onun name adlı sahəsi var:
class Animal:
def __init__(self, name):
self.name = name
Biz ondan iki uşaq sinifi yaratmaq istəyirik — Dog
və Cat
, hər biri üçün speak
metodunu əlavə etmək istəyirik:
class Dog(Animal):
def speak(self):
return f"{self.name} deyir Woof!"
class Cat(Animal):
def speak(self):
return f"{self.name} deyir Meow!"
Yuxarıdakı nümunədə Dog
və Cat
adlı uşaqlar Animal
-dan irsi alırlar və speak
metodunu əlavə edirlər.
Dog
sinifi:
Animal
-danname
atributunu irsi alır.- İtlərə xas olan xüsusi bir sətir qaytaran
speak
metodunu əlavə edir.
Cat
sinifi:
Animal
-danname
atributunu irsi alır.- Pişiklərə xas olan xüsusi bir sətir qaytaran
speak
metodunu əlavə edir.
Final kod versiyası belə görünür:
class Animal:
def __init__(self, name):
self.name = name
class Dog(Animal):
def speak(self):
return f"{self.name} deyir Woof!"
class Cat(Animal):
def speak(self):
return f"{self.name} deyir Meow!"
dog = Dog("Buddy")
cat = Cat("Whiskers")
print(dog.speak()) # Çap edəcək: Buddy deyir Woof!
print(cat.speak()) # Çap edəcək: Whiskers deyir Meow!
Bu nümunədə Animal
valideyn sinifdir, Dog
və Cat
isə uşaq siniflərdir. Uşaq siniflər Animal
valideyn sinifindən name
atributunu və __init__
metodunu miras alır, lakin speak
metodlarını əlavə edirlər.
6.2 Mirasın "qapağını qaldıranda"
Əgər siz sinifinizə bir parent əlavə etmisinizsə, bu çox oxşayır sanki parent sinifinin kodunu sizin sinifə kopyalamısınız.
class Animal:
def __init__(self, name):
self.name = name
class Dog(Animal):
def __init__(self, name):
super().__init__(name) # Parent sinifin konstruktorunu çağırır
def speak(self):
return f"{self.name} deyir Hav!"
class Cat(Animal):
def __init__(self, name):
super().__init__(name) # Parent sinifin konstruktorunu çağırır
def speak(self):
return f"{self.name} deyir Miyav!"
dog = Dog("Buddy")
cat = Cat("Whiskers")
print(dog.speak()) # Çıxacaq: Buddy deyir Hav!
print(cat.speak()) # Çıxacaq: Whiskers deyir Miyav!
Bu tam dəqiq təsvir deyil, amma əgər siz heç vaxt miras anlayışı ilə qarşılaşmamısınızsa, hələ ki bu barədə belə düşünə bilərsiniz. Daha sonra bura bir az daha detallar əlavə edəcəyik.
6.3 İrsilik Hirarşisi
Çox vaxt böyük bir siniflər qrupunun mürəkkəb modelini layihələndirərkən, irsilik hirarşisi ilə qarşılaşa bilərsiniz.
Məsələn, sizdə Animal
sinfi var — bu bütün heyvanlar üçün əsas sinifdir:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("Subclass mütləq abstrakt metodu implement etməlidir")
Hətta biz ona speak
metodu əlavə etmişik, amma abstrakt heyvan danışmadığı üçün bu metod sadəcə NotImplementedError
istisnasını atır — bu standart bir təcrübədir.
Sonra biz heyvan kateqoriyalarına uyğun olan aralıq siniflər əlavə edirik: Mammal
— məməlilər və Bird
quşlar üçündür.
class Mammal(Animal):
def __init__(self, name, fur_color):
super().__init__(name) # Valideyn sinfinin konstruktorunun çağrılması
self.fur_color = fur_color
class Bird(Animal):
def __init__(self, name, wing_span):
super().__init__(name) # Valideyn sinfinin konstruktorunun çağrılması
self.wing_span = wing_span
def fly(self):
return f"{self.name} {self.wing_span} metr qanad genişliyi ilə uçur."
Və nəhayət, yalnız son mərhələdə konkret heyvan növlərinin sinifləri yaranır:
class Dog(Mammal):
def speak(self):
return f"{self.name} deyir Hav-hav!"
class Cat(Mammal):
def speak(self):
return f"{self.name} deyir Miyau!"
class Parrot(Bird):
def speak(self):
return f"{self.name} deyir Skua!"
Bax, adətən son kod onlarla işləyir:
animals = [Dog("Buddy", "qəhvəyi"), Cat("Whiskers", "ağ"), Parrot("Polly", 0.5)]
for animal in animals:
print(animal.speak())
print(f"{dog.name} {dog.fur_color} rəngdə tükə sahibdir.") # Nəticə verəcək: Buddy has brown fur.
print(f"{cat.name} {cat.fur_color} rəngdə tükə sahibdir.") # Nəticə verəcək: Whiskers has white fur.
print(parrot.fly()) # Nəticə verəcək: Polly is flying with a wingspan of 0.5 meters.
Baxmayaraq ki, texniki olaraq onlarla ata sinfi olan hirarşiyaların yaradılmasına heç bir qadağa yoxdur, yadda saxlamaq lazımdır ki, zərurət olmadan sadəlikdən yapışmaq daha yaxşıdır. Sadəlikdə güc var.
GO TO FULL VERSION