7.1 super()
metodu
İyerarxiya üzrə mirasdan danışmağa başladığımız üçün baza sinifinin sahələri və metodları ilə işləmə nüanslarını öyrənmək faydalı olar. Bunun üçün Python-da xüsusi bir super()
metodu var. Bu metod, övlad sinifdə baza sinifinin metodlarını çağırmaq üçün istifadə olunur.
Onun üç əsas istifadə sahəsi var:
Valideyn sinfin metodlarını çağırmaq:
super()
metodu övlad sinifdə valideyn sinfin metodunu heç bir şəkildə valideyn sinfin adını açıq şəkildə göstərmədən çağırmağa imkan verir. Bu, xüsusilə çoxsaylı miras ilə işləyərkən faydalıdır və siniflər iyerarxiyasında dəyişikliklər edərkən səhvlərdən qaçmağa kömək edir.
Baza siniflərin inisializasiyası:
super()
tez-tez övlad sinfin konstruktorunda baza sinfinin konstruktorunu çağırmaq üçün istifadə olunur ki, baza sinfinin atributlarını övlad sinifdə inisializasiya etmək mümkün olsun.
Çoxsaylı mirasa dəstək:
Çoxsaylı miras halında super()
metodların çağırılma sırasını (MRO, Method Resolution Order) düzgün şəkildə təyin edir ki, bu da valideyn siniflərin metodlarının açıq şəkildə çağırılmasına nisbətən daha üstünlük təşkil edir. Bu barədə bir az sonra danışacağıq.
7.2 Əsas sinifin konstruktoru
Əsas sinifin konstruktoru açıq-aşkar çağırılmalıdır. Bu avtomatik olaraq baş verir kimi görünə bilər, amma əslində belə deyil. Əsas siniflərin konstruktorlarını hər zaman açıq-aşkar çağırmaq lazımdır, çünki çox vaxt onlara xüsusi arqumentlər ötürmək lazımdır.
Nümunə:
class Animal:
def __init__(self, type, name):
self.type = type
self.name = name
class Dog(Animal):
def __init__(self, name):
super().__init__("İt", name) # Əsas sinifin konstruktorunun çağırılması
class Cat(Animal):
def __init__(self, name):
super().__init__("Pişik", name) # Əsas sinifin konstruktorunun çağırılması
# Dog obyektinin yaradılması
dog = Dog("Buddy")
print(dog)
Bu nümunədə əsas sinifin (Animal)
konstruktorunun iki parametri var: heyvanın tipi və onun adı. Amma törəmə siniflərin yalnız bir parametri var — yalnız ad.
Məhz Dog
və Cat
siniflərinin konstruktorlarında qərar verilir ki, əsas sinifin konstruktoruna nə ötürülsün — heyvan tiplərinin adları «İt» və «Pişik».
Belə ki:
- Əsas sinifin konstruktoru mütləq tövsiəlmə sinifin konstruktorunda çağırılmalıdır.
- Bunun üçün
super()
metodundan istifadə etmək lazımdır. -
self
parametrini ayrıca ötürməyə ehtiyac yoxdur — Python bunu avtomatik olaraq metoda çağırışda daxil edəcək.
7.3 super()
metodundan istifadə
Python-da super()
metodu təkcə konstruktorlarda deyil, həmçinin digər class metodlarında istifadə edilə bilər ki, bu da parent class metodlarını çağırmağa imkan yaradır. Bu, parent class-da müəyyən edilmiş metodu əlavələr və ya dəyişikliklərlə genişləndirmək lazım olduqda faydalı ola bilər.
Bir neçə nümunəyə baxaq:
Parent class metodunun child metodunda çağrılması
Bu nümunədə Dog
class-ındakı speak()
metodu əvvəlcə Animal
class-ındakı speak()
metodunu super()
vasitəsilə çağırır, sonra isə öz davranışını əlavə edir.
class Animal:
def speak(self):
return "Hər hansı bir ümumi heyvan səsi"
class Dog(Animal):
def speak(self):
parent_speech = super().speak() # Parent class metodunun çağırılması
return f"{parent_speech} Və it hürür!"
dog = Dog()
print(dog.speak()) # Nəticə: Hər hansı bir ümumi heyvan səsi Və it hürür!
Parent class metodunun vəziyyəti yoxlamaq üçün çağırılması
Bu nümunədə Dog
class-ındakı check_health()
metodu parent class-ın check_health()
metodunu çağırır və əlavə yoxlamalar əlavə edir.
class Animal:
def check_health(self):
return "Heyvan sağlamdır"
class Dog(Animal):
def check_health(self):
parent_check = super().check_health() # Parent class metodunun çağırılması
return f"{parent_check}. İt gəzməyə ehtiyac duyar!"
dog = Dog()
print(dog.check_health()) # Nəticə: Heyvan sağlamdır. İt gəzməyə ehtiyac duyar!
Parent class metodunun vəziyyəti dəyişən metodda çağırılması
Bu nümunədə SavingsAccount
class-ındakı withdraw()
metodu əvvəlcə məbləğin çıxarma limitini aşmadığını yoxlayır, daha sonra əməliyyatı icra etmək üçün BankAccount
class-ındakı withdraw()
metodunu çağırır.
class BankAccount:
def __init__(self, balance):
self.balance = balance
def withdraw(self, amount):
if self.balance >= amount:
self.balance -= amount
return f"{amount} çıxarıldı. Yeni balans: {self.balance}"
return "Kifayət qədər vəsait yoxdur"
class SavingsAccount(BankAccount):
def withdraw(self, amount):
if amount > 1000:
return "Çıxarma limiti aşılmışdır"
return super().withdraw(amount) # Parent class metodunun çağırılması
savings = SavingsAccount(1500)
print(savings.withdraw(500)) # Nəticə: 500 çıxarıldı. Yeni balans: 1000
print(savings.withdraw(1500)) # Nəticə: Çıxarma limiti aşılmışdır
GO TO FULL VERSION