Python’da Soyut Sınıflar (Abstract Classes)

Bu derste, Python’da soyut sınıflar (Abstract Classes) konseptinin ne olduğunu, nasıl kullanıldığını ve neden önemli olduklarını detaylarıyla inceleyeceğiz.

Soyut Sınıf Ne Demek?

Soyut sınıf, diğer sınıfların temelini oluşturmak için tasarlanmış bir sınıftır ve doğrudan örneklenemez. Yani soyut sınıfların tasarım amaçlarını doğrudan bir nesne olarak kullanmak yerine diğer sınıflar için bir temel veya şablon olarak hizmet etmeleri gerektiği anlamına gelir. Bu da demektir ki, bu tür sınıflardan doğrudan bir nesne oluşturulamaz. Zaten bunun için de kullanılmaz. Daha ziyade, “ortak kodlara” sahip sınıflarda tekrar tekrar bu kodları yazmak yerine, bu kodları miras alacakları ortak bir sınıf oluşturmaktır.

Nasıl ki bir sınıf (class), ondan türetilen nesneler için bir taslak görevi görüyorsa, soyut sınıflar ile de sınıflar için ortak bir taslak görevi görüyor diyebiliriz.

“Peki, neden böyle bir şey var?” Nedenlerden biri, aynı kodun tekrar tekrar yazılmaması gerektiğini öğütleyen DRY prensibidir (Don’t Repeat Yourself). Soyut sınıflar da bu prensibi destekler. Nasıl mı? Diyelim ki, farklı sınıfların benzer işlevleri veya özellikleri olması gerektiğini fark ettik. Bunun yerine her sınıf için aynı işlevleri tekrar tekrar tanımlamak yerine, bu işlevleri bir soyut sınıf içinde tanımlayarak ve bu sınıfı miras alarak DRY prensibine uygun bir şekilde çalışabiliriz.

Böylece, soyut sınıflar sayesinde, hem kod tekrarını önleriz hem de tüm alt sınıfların belirli bir arayüz veya davranışı takip etmesini garantileyerek (belirli metotların tüm alt sınıflar tarafından tanımlanmasını zorunlu kılarak) tutarlılık sağlarız.

Ancak belirtmek isterim ki, soyut sınıflar genellikle bazı soyut metotlar içerir; bu metotlar alt sınıflar tarafından zorunlu olarak tanımlanmalıdır.

Python’da Soyut Sınıfların Oluşturulması

Python’da soyut sınıflar, abc modülü (Abstract Base Class) kullanılarak oluşturulur. Bu modül, soyut sınıflar ve metotlar oluşturmak için gereklidir. Örneğin:

Yukarıdaki örnekte, Hayvan adlı soyut bir sınıf oluşturduk. Bu sınıf içerisinde, alt sınıfların zorunlu olarak tanımlaması gereken soyut bir metot olan ses_cikar‘ı tanımladık.

Soyut Sınıfları Miras Alma

Soyut sınıftan miras alan alt sınıfları, soyut sınıf içinde tanımlanan tüm soyut metotları tanımlamalıdır. Eğer tanımlanmazsa bir hata alınır. Örneğin:

Yukarıdaki örnekte, Kopek sınıfı Hayvan sınıfını miras aldı ve ses_cikar metodunu tanımlayarak zorunluluğu yerine getirdi.

Daha iyi anlaşılması adına örneğimizi hem soyut sınıf kullanmadan hem de kullanarak yazalım. Bakınız:

Yukarıdaki kodda ses_cikar metodu her bir sınıf için tekrar tekrar yazıldı. Bunu soyut sınıf kullanarak optimize edebiliriz. Bakınız:

Bu örnekte Hayvan adında bir soyut sınıf tanımladık ve bu sınıfın içerisinde bir ses_cikar adında soyut bir metot tanımladık. Kopek, Kedi ve Kus sınıfları bu soyut sınıfı miras alarak kendi versiyonlarını tanımladılar. Soyut sınıf sayesinde, (zaten kullanılacak olan) ses_cikar metodunun her bir alt sınıf tarafından tanımlanması zorunlu kılındı. Bu sayede, eğer bu metodu tanımlamazsak bir hata alırız, bu da bize bir nevi güvence sağlar.

Ayrıca ilk örnekte, üç sınıfın da ses_cikar metotuna sahip olması tamamen tesadüfidir. Bu sınıflardan biri bu metodu tanımlamazsa, bu bir hataya neden olmaz. Ancak ikinci örnekte, bu metodu tanımlamamak bir hatadır.

Bu da bize soyut sınıf kullanmamanın bir diğer dezavantajını gösterir, yani hataların sadece runtime’da (çalışma zamanında) fark edilmesine sebep olur. Soyut sınıf kullanıldığında ise eğer bir sınıf, soyut sınıfın zorunlu metodunu tanımlamadığında daha kod çalıştırılmadan hemen önce fark edilir. Bu da hataların erken fark edilmesine ve daha sağlam kodlar yazılmasına yardımcı olur.

Üstelik gelecekte, Hayvan soyut sınıfına yeni soyut metotlar veya özellikler eklenebilir. Bu durumda, bu sınıftan türetilen tüm sınıfların bu yeni metotları da uygulaması gerektiğini bilmemiz sağlanır. Bu, projenin evrilmesi ve genişlemesi durumunda bize yardımcı olabilir.

Soyut Sınıflar Somut Metotlara Sahip Olabilir

Belirtmek isterim ki, soyut sınıfların tanımladığı metotlar yalnızca soyut metotlarla sınırlı değildir. Soyut sınıflar, somut (concrete) metotlar, özellikler (attributes) ve hatta sınıf metotları veya statik metotları da tanımlayabilir. Türetilen sınıflar, bu özelliklere ve metodlara doğrudan erişebilir.

Bu, türetilen sınıfların soyut sınıfta tanımlanan bazı ortak işlevleri veya özellikleri kullanmasına olanak tanır, bu sayede kod tekrarını önler ve kodun daha düzenli olmasını sağlar. Ancak, türetilen sınıfların, soyut sınıfta tanımlanan soyut metotları tanımlamaları zorunludur. Bir örnekle açıklayalım:

Bu örnekte Hayvan soyut sınıfı içerisinde hem bir soyut metot (ses_cikar) hem de bir somut metot (bilgi_ver) tanımladık. Kopek sınıfı bu soyut sınıfı miras aldı ve soyut metodun gerekliliğini yerine getirdi. Ancak, bilgi_ver somut metodu zaten tanımlı olduğu için bu metodu tekrar tanımlamamıza gerek kalmadı ve doğrudan kullanabildik. Kodu çalıştırmak için: Trinket

Özetle, Python’da soyut sınıflar ve soyut metotların ana amacı, kodun daha tutarlı, anlaşılır ve genişletilebilir olmasını sağlamaktır. Soyutlama, OOP’nin temel prensiplerinden biridir ve doğru kullanıldığında projenin kalitesini artırabilir.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu