CodeGym /Kurslar /Python SELF AZ /Çoxsaylı miras alma

Çoxsaylı miras alma

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

10.1 Bir neçə classdan miras almaq

Çoxsaylı miras Python-da bir class-a bir neçə valideyn class-dan atributları və metodları miras almağa imkan verir. Bu, daha böyük elastiklik təqdim edir və kodun təkrar istifadəsini təmin edir, lakin həmçinin mürəkkəb iyerarxiyalara və potensial münaqişələrə səbəb ola bilər.

Öz class-ınız üçün beş valideyni sadalaya bilmə qabiliyyəti imkanlarınızı xeyli genişləndirir və kod yazmağı olduqca rahat edir. Bunu etmək çox sadədir — sadəcə valideyn class-ları vergüllə ayırın:


class Base1:
    def method1(self):
        print("Base1-dən Method1")
        
class Base2:
    def method2(self):
        print("Base2-dən Method2")
        
class Derived(Base1, Base2):
    pass
        
obj = Derived()
obj.method1()
obj.method2()     
        

Hər şey planlaşdırıldığı kimi işləyir — gözəllik.

Lakin çoxsaylı mirasın bir neçə mürəkkəb tərəfi var ki, onlardan istifadə edərkən nəzərə alınmalıdır. Gəlin baxaq, bu necə işləyir və çoxsaylı mirasla bağlı problemlərdən necə qaçmaq olar.

10.2 Bir neçə əsas sinifdə olan metodu çağırmaq

Sinif birdən çox valideyn sinifdən atributları və metodları miras ala bilər, sinif adının ardınca mötərizədə sadalanır. Bu atributlar və metodlar eyni adlara sahib ola bilər:


class Base1:
    def method(self):
        print("Method from Base1")
        
class Base2:
    def method(self):
        print("Method from Base2")
        
class Derived(Base1, Base2):
    pass
        

obj = Derived()
obj.method() # burada hansı metod çağırılacaq?
        

Bu nümunədə Derived sinfi Base1Base2 siniflərindən miras alır. Nə vaxt ki method() çağırılır, Python birinci olaraq qeyd olunan sinfin metodunu seçir — Base1.

Amma bu o qədər də açıq deyil, elə deyilmi? Əgər kimsə əsas sinfin kodunu dəyişdirsə, bütün tətbiqin məntiqi zədələnə bilər və siz heç bilməzsiniz ki, nələrsə səhvdir. Sadəcə bir az başqa metodlar çağırılmağa başlar :)

10.3 super()-dan çoxsaylı inheritance ilə istifadə

Daha bir maraqlı xüsusiyyət — çoxsaylı inheritance zamanı əsas class üçün super()-ın çağırılmasıdır.

Nümunə:


class Base1:
    def method(self):
        print("Method Base1-dən")
        super().method()
        
class Base2:
    def method(self):
        print("Method Base2-dən")
        super().method()
        
class Derived(Base1, Base2):
    def method(self):
        print("Method Derived-dən")
        super().method()
         

obj = Derived()
obj.method()
        

Nə deyirsən? Ekranda nəticə necə olacaq?

Method Derived-dən
Method Base1-dən

Yoxsa

Method Derived-dən
Method Base2-dən

Sənə bir sürprizim var — nəticə belə olacaq:

Method Derived-dən
Method Base1-dən
Method Base2-dən

super().method() kodu hər bir əsas class-da method() metodunu çağıracaq! Məhz bu həmin detallardır ki, çoxsaylı inheritance haqqında ilk dəfə danışanda qeyd etmişdim.

10.4 Brilyant formalı (Diamond) irsiyyət

Nəhayət, klassik brilyant formalı irsiyyət problemi. Bunu təsvir etməkdən daha çox, misal üzərindən göstərmək asandır:

Kod şəklində bu, məsələn, belə görünə bilər:


class A:
    def method(self):
        print("Method from A")
        
class B(A):
    def method(self):
        print("Method from B")
        super().method()
        
class C(A):
    def method(self):
        print("Method from C")
        super().method()
        
class D(B, C):
    def method(self):
        print("Method from D")
        super().method()
         
         
        
obj = D()
obj.method()
        

Nəticə belə olacaq:

Method from D
Method from B
Method from C
Method from A 

Çoxsaylı irsiyyətdə baş çıxarmaq üçün sizə yaxşı bilmək lazımdır ki, Python valideyn siniflərdə sahələri və metodları hansı ardıcıllıqla axtarır. Məhz bunun haqqında növbəti mühazirədə məlumat alacaqsınız.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION