şükela:  tümü | bugün
1 entry daha
  • multiple inheritance'ın yol açtığı bir problem. bu problemin izahı bir örnek ile yapılabilir. elimizde 3 farklı tipte sınıf olduğunu düşünelim:

    - class_a: base (temel) sınıf
    - class_b ve class_c: class_a'dan türetilen iki farklı (derived) sınıf
    - class_d: temel sınıftan türetilen iki farklı sınıftan inherit alan bir başka türetilen (derived) sınıf

    class_a içerisinde speak adında bir metot olsun. class_b ve class_c, class_a'daki speak metodunu override (ezerek) ederek speak metodunu çağıracak. class_d ise, class_b ve class_c'nin speak metodunu override (ezerek) ederek hem class_b'deki hem de class_c'deki speak metodunu çağıracak.

    class class_a:
    ....def speak(self):
    ........print("class_a sinifindan cagirildi")

    class class_b(class_a):
    ....def speak(self):
    ........print("class_b sinifindan cagirildi")
    ........class_a.speak(self)

    class class_c(class_a):
    ....def speak(self):
    ........print("class_c sinifindan cagirildi")
    ........class_a.speak(self)

    class class_d(class_b, class_c):
    ....def speak(self):
    ........print("class_d sinifindan cagirildi")
    ........class_b.speak(self)
    ........class_c.speak(self)

    my_class = class_d()
    my_class.speak()

    buradaki sorun şu; biz base (temel) sınıftaki speak metodunun bir kere çağırılmasını beklerken iki kere çağırılmış oldu. aslında yapmak istediğimiz şey (ve multiple inheritance ile akılda tutulması gereken ilk kural) sınıf hiyerarşisi içerisinde bir sonraki metodun çağırılması fakat bu problem nedeni ile biz parent (ebeveyn) metodu çağırmış olduk. python dilinde bu problem super() ile çözülüyor.

    class class_a:
    ....def speak(self):
    ........print("class_a sinifindan cagirildi")

    class class_b(class_a):
    ....def speak(self):
    ........print("class_b sinifindan cagirildi")
    ........super().speak()

    class class_c(class_a):
    ....def speak(self):
    ........print("class_c sinifindan cagirildi")
    ........super().speak()

    class class_d(class_b, class_c):
    ....def speak(self):
    ........print("class_d sinifindan cagirildi")
    ........super().speak()

    my_class = class_d()
    my_class.speak()

    artık base (temel) sınıfımızdaki speak metodu bir kere çağırılıyor. burada dikkat edilmesi gereken nokta sınıf hiyerarşisinin (bkz: method resolution order) sondan başa doğru işlemesidir. multiple inheritance kullanırken bu tip problemler ile karşılaşmamak için sınıflarınızı iyi tasarlamanız gerekmektedir. oluşacak herhangi bir bug nedeniyle yapacağınız herhangi bir işlemi iki kere yapmış olabilirsiniz.

    * örnekler python 3 için geçerlidir. aşağıda python 2 için çözümü de bulabilirsiniz.
    https://git.io/vwggb
2 entry daha