İçeriğe geç

Python’da Metot Override Etmek

AB2015’de vereceğimiz “Python ile Oyun Programlamaya Giriş” kursuna hazırlık yaparken, kullanacağımız kütüphanede (Python SFML) bir hata keşfetmiştim. İki tane Rectangle nesnesinin birbiriyle kesişip kesişmediğini gösteren bir metot hatalı olara çalışıyordu. Normalde Github’daki repoda bu hata hemen kapatılmıştı fakat Ubuntu’daki 1.3 sürümünde bu hata halen daha devam ediyor. Launchpad üstünden yaptığım hata bildirimi ve düzeltmesine rağmen halen yeni haliyle paketlenmeyince, ben de daha farklı bir yönteme girişeyim dedim. Hata bildirimi burada:

https://bugs.launchpad.net/ubuntu/+source/python-sfml/+bug/1400906

Normalde sitesinde de hemen bir çözüm yolu önermişler, hatanın farkında olup:

http://en.sfml-dev.org/forums/index.php?topic=11436.0

Ama bu kütüphaneyi derlemesi inanılmaz zahmetli, bu yüzden mevcut depoyu kullanmak daha akıl karı duruyor. Tabi hatalı olan metodu override etmek için Ruby’deki açık sınıf sistemini düşündüm başta, zira Ruby’de bu sistem tek kelimeyle şahane işliyor. Örneğin String sınıfının içerisindeki, to_sym metodunu şu şekilde kolayca override edebiliyoruz:

Aynısını Python’da yapmak için, yani kalıtım yapmadan, nasıl bir yol izlerim derken şöyle bir şey keşfettim, Ruby’deki sisteme göre başta kolay gözükse de aslında biraz daha zor. Basit, örnek bir sınıf tanımlayarak bakalım:


Kitap sınıfındaki bilgi metodunu override etmek istediğimizde şöyle bir yöntem gerekecek:


Bunlara bakınca zor gibi gelmiyor evet ama C eklentileri (extension) kullanan bir kütüphane, örneğin Cython’la geliştirilen Python SFML kütüphanesi, bu tarz metot override etmeye izin vermiyor ve şu hatayı veriyor:

Bunun için çözüm ise forbiddenfruit adlı bir Python kütüphanesi. Doğrudan pip ile kurulabiliyor:


Ardından proje içersisinde kütüphanein içerisindeki curse metodunu kullanarak istediğimiz metodu override edebiliyoruz, C ile derlenmiş olsa bile.

curse metoduna sırasıyla sınıf ismi, override edilecek metodun karakter dizisi şeklinde ismi ve override edecek metodun ismi verilecek kolayca halledilebiliyor.

Tarih:Genel