İrsi

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

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 — DogCat, 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ə DogCat adlı uşaqlar Animal-dan irsi alırlar və speak metodunu əlavə edirlər.

Dog sinifi:

  • Animal-dan name atributunu irsi alır.
  • İtlərə xas olan xüsusi bir sətir qaytaran speak metodunu əlavə edir.

Cat sinifi:

  • Animal-dan name 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, DogCat 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.

1
Опрос
Siniflər və OOP,  15 уровень,  6 лекция
недоступен
Siniflər və OOP
Siniflər və OOP
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION