AÖF Soru Bankası

Programlama IIÜnite 6 Özeti

Nesne ve Sınıf

BİL203U-PROGRAMLAMA II

Ünite 6: Nesne ve Sınıf

Giriş

Nesne yönelimli programlama, günümüz yazılım geliştirme uygulamalarında sıklıkla tercih edilen bir programlama dili modelidir. Yazılım tasarımını nesneler ve sınıflar üzerinde düzenleyen bir modeldir. Yaşanan teknolojik sorunlar ve ihtiyaçlar neticesinde 1960’lı yılların başında ortaya çıkmıştır.

Nesne yönelimli programlamada, her birinin kendi özellik ve davranışa sahip olduğu veri yapıları ve nesneler tanımlanmaktadır. Birbirleriyle etkileşime geçen nesneler kullanılarak yazılımlar tasarlanmıştır. Bu nesnelerin her biri de kendi özel metot ve prosedürlerini içerebilmektedir.

Nesne yönelimli programlama, Doğal, güvenilir, yeniden kullanılabilir, sürdürülebilir, genişletilebilir ve zamandan tasarruf sağlamak olmak üzere toplam 6 öncelikli hedefe odaklanmıştır.

Nesne Yönelimli Programlama (OOP-Object Oriented Programming)

Object Oriented Programming (OOP) yani Türkçe karşılığı Nesne Yönelimli Programlama ya da Nesne Tabanlı Programlama olarak çevirebileceğimiz bir programlama yaklaşımıdır. Python programlama dili de farklı programlama yaklaşımlarını desteklemesinin yanında nesne yönelimli bir dil olarak geliştirilmiştir.

Python programlama dilindeki OOP, nesneleri ve sınıfları diğer genel programlama dilleriyle aynı şekilde kullanmaya odaklanan bir programlama yaklaşımı olduğu söylenebilir. Python, geliştiricilerin kodun yeniden kullanılabilirliğine odaklanan OOP yaklaşımını kullanarak uygulamalar geliştirmelerine olanak tanımaktadır. Buradaki asıl amaç tekrar kullanılabilir kod yazarak tekrarı önlemektir.

Python programlamada, sınıf ve nesne oluşturmak oldukça kolaydır. Nesne yönelimli yaklaşımda oluşturulan nesneler, gerçek hayattaki nesnelerden de seçilebilir. Programlamada kullanılan nesnelerin iki temel özelliği vardır:

1. Özellikleri (Attributes) 2. Davranışları (Methods)

Nesne Yönelimli Programlamadaki Terimler

Sınıf (Class)

Sınıf, nesne için bir tasarım, şablon veya ayrıntılı plandır diyebiliriz. Sınıf, bir örnek verecek olursak, araç için bir tasarım şablonu olduğunu düşünebiliriz. Rengi, boyutları, parça bilgileri, tesisat bağlantıları gibi tüm detaylı özellikleri içermektedir. Tüm bu özelliklere göre yeni bir araç üretimi için gerekli çalışmaların yapılabilmesine yardımcı olmaktadır.

Nesne (Object)

Bir nesne, bir sınıfın somutlaştırılmış haline verilen isimdir. Sınıf oluşturulduğunda sadece nesnenin tanımı yapılmış olur. Bu tanım bellekte veya depolama alanında bir yer işgal etmez.

Metotlar (Methods)

Metotlar, sınıfın içerisinde tanımlanmış fonksiyonlardır. Bir nesnenin davranışlarını tanımlamak için kullanılırlar. Metotlar, parametre alabilir, geri değer döndürebilir ve sadece çağrıldığında çalışan kod bloklarıdır.

Kalıtım-Miras

Kalıtım ile mevcut bir sınıfın nitelikleri ve davranışları değiştirilmeden, bu özelliklerin tekrar düzenlenebileceği yeni bir sınıf oluşturulabilir. Yeni oluşturulan sınıf, türetilmiş bir sınıftır ve alt sınıf olarak da isimlendirilir. Benzer şekilde, mevcut sınıf bir temel sınıftır ve ana sınıf olarak da isimlendirilir.

Kapsülleme (Encapsulation)

Python programlama dilinde nesne yönelimli programlama kullanılarak, değişken ve metotlara erişim kısıt- lanabilmektedir. Bu kısıtlama işlemine kapsülleme adı ve- rilmektedir ve verilerin doğrudan erişilip değiştirilmesini önlemek amacıyla kullanılmaktadır. Özel nitelikler tek ‘_’ veya çift ‘__’ alt çizgi kullanılarak belirtilmektedir.

Çok Biçimlilik (Polymorphism)

Nesne yönelimli programlamada Çok Biçimlilik kavramı, farklı veri türleri, sınıflar için ortak bir arabirim kullanma kabiliyetidir. Örneğin bir şeklin alan hesaplaması yapılması istendiğinde, farklı şekiller için farklı birer formül kullanılması gerekecektir. Aynı metodu kullanarak farklı şekillerin alanlarının hesaplanabilmesine çok biçimlilik denilmektedir.

Nesne Yönelimli Programlamada dikkat edilmesi gereken anahtar noktaları şu şekilde listeleyebiliriz:

• Nesne Yönelimli Programlama, programların daha verimli çalışmasının yanında programcıların daha rahat anlamasına yardımcı olur. • Veri soyutlama ile program daha güvenli bir hale gelmektedir • Paylaşıma açık olan sınıflar ile kodların tekrar kullanılabilirliği sağlanmaktadır • Çok biçimlilik sayesinde, farklı nesnelerde aynı özelliklerin desteklendiği arayüzler ile daha verimli kod yazılmasına izin verilmektedir.

Sınıf ve Nesne (Class & Object)

Nesne yönelimli bir programlama dili olan Python, prosedür yönelimli dillerin aksine, nesneler üzerinde durmaktadır. Bir sınıf, kendisinden oluşturulacak nesneler için bir şablon niteliğindedir. Sınıflara özellik ve yöntemler atanabilmektedir.

Bir sınıftan birçok nesne oluşturulabilir. Oluşturulan nesneye, oluşturulduğu sınıfın örneği (instance) denir ve bu nesne oluşturma işlemi de örnekleme (instantiation) olarak adlandırılır.

Sınıf Tanımlama

Sınıf tanımlamaları class anahtar kelimesi ile başlamaktadır. Sınıfın içindeki ilk metin dizisine docstring


adı verilmektedir. Bu metin, sınıfın kısa bir açıklamasını içermektedir. Bu kısım zorunlu değildir fakat tanımlanması tavsiye edilmektedir.

Bir sınıfın tanımlanmasıyla birlikte, sınıfın tüm niteliklerinin yani veri ve fonksiyonlarının tanımlandığı bir yerel ad alanı (namespace) oluşturulmaktadır. Bunun yanında, yeni bir sınıf tanımlandığında, sınıf ile aynı isme sahip bir sınıf nesnesi oluşturulmaktadır. Bu oluşturulan sınıf nesnesi yardımıyla farklı niteliklere erişilebilmekte ve o sınıftan yeni nesneler üretilmesine izin verilmektedir.

Tüm Python sınıflarının yerleşik özellikleri vardır. Bu özelliklere diğer özelliklere erişildiği gibi (.) nokta operatörü kullanılarak erişilebilmektedir. Sınıfların yerleşik özellikleri de şu şekilde listeleyebiliriz:

• __doc__ : Sınıf oluşturulurken tanımlanmışsa, sınıfa ait açıklama metnini döndürür • __dict__ : Sınıfın niteliklerini içeren sözlük değerini döndürür • __name__ : Sınıfın adını döndürür • __module__ : Çağrıldığı nesne veya fonksiyonun adını, yoksa None değeri döndürür • __ bases__ : Bir sınıf nesnesinin temel sınıflarının, türetildiği sınıfların demetini (tuple) döndürür.

Nesne Oluşturma

Sınıf nesnesi üzerinden sınıfın çeşitli özelliklerine erişilebilmektedir. Bunun yanında, o sınıftan yeni bir nesne oluşturmak için de kullanılmaktadır. Bu işlem, bir fonksiyon çağırmaya benzemektedir.

Sınıf içinde tanımlanan tüm fonksiyonlar, diğer normal fonksiyonlardan farklı olarak, ilk parametreleri self anahtar kelimesi olması gerekmektedir. Bu anahtar kelime, sınıfın kendisine verilen bir referanstır ve sınıfa ait tüm özelliklere erişmek için kullanılmaktadır. Bu anahtar kelime “self” olarak isimlendirilmesi gerekmez, fakat genel kullanım bu yöndedir. Bu şekilde kullanıldığında programı okuyan başka kişiler de zorlanmayacaktır. Ayrıca fonksiyon çağrıldığında bu parametreye değer atanmaz, Python yorumlayıcısı arka planda bunu yapmaktadır.

Kurucu/Yapıcı Metotlar (Constructors)

Python programlama dilinde, sınıflar içerisinde tanımlı fonksiyonlarından çift altçizgi ile başlayan fonksiyonlara özel fonksiyonlar denmektedir. Bir sınıftan yeni bir nesne oluşturulacağı zaman __init__() metodu çağrılmaktadır. Bu metoda, nesne yönelimli programlamada sınıfın kurucu metodu adı verilmektedir. Nesne için bellekte yer ayrıldığı anda bu metot çağırılmaktadır.

Bu metot, sınıfın ilk metodu olmalıdır. İlgili sınıftan türetilecek olan nesnelere ilk değer atamaları bu metot ile yapılmaktadır.

Nesne ve Özellik Silme

Bir nesne veya bir özellik del fonksiyonu kullanılarak silinebilir.

Nesne oluşturma işleminin arka planında, araç = Araç(“Hyundai”, “Tucson”, “Kırmızı”, “Dizel”, “Oto- matik”) kodu ile hafızada yeni bir Araç nesnesi oluşturulur ve araç ismine bu hafızadaki adres eşleştirilir.

del( araç ) komutu ile, oluşturulan nesneye verilen araç ismi silinerek hafızadaki bu ilişki kaldırılmış olacaktır. Fakat Araç nesnesi halen daha hafızada durmaktadır. Eğer bu nesneye başka bir isim eşleştirilmezse, bir müddet sonra hafıza temizleyici (Garbage Collector) tarafından otomatik olarak hafızadan silinecektir.

Pass Anahtar Kelimesi

Python programlama dilinde, oluşturulan sınıflar boş bırakılamaz. En az bir satır komut yazılması bek- lenmektedir. Sınıf içeriği boş bırakılacaksa, pass anahtar kelimesi ile bu gereklilik yerine getirilmiş olacaktır.

Sınıf Kalıtımı (Inheritance)

Kalıtım vasıtasıyla, tüm özelliklerini ve metotlarını tü- retildiği sınıftan alan ve bunlara yeni özellikler eklenmesine izin verilen bir alt sınıf oluşturulabilir. Oluşturulan sınıf alt sınıf, kalıtım aldığı sınıf da üst sınıf olarak da adlandırılır.

Kalıtım kullanılarak oluşturulan sınıflarda, üst/ana sınıfın tüm özellikleri alt sınıfa aktarılarak kullanılmasına izin verilir. İhtiyaç duyulması halinde üst sınıfın metotları geçersiz kılınarak (override) tekrar tanımlanabilir.

Python programlama dilinde, İki tane öntanımlı isinstance() ve issubclass() metotları ile ilgili nesnenin kalıtımı kontrol edilebilmektedir.

isinstance() fonksiyonu ile, oluşturulan nesne sınıfın veya o sınıftan türetilen bir sınıfın örneği ise True (doğru) değeri döndürmektedir. Ayrıca Python programlama dilinde her sınıf, “object” temel sınıfından türetilmiştir.

Çoklu Kalıtım

Python programlama dilinde de, C++ dilinde olduğu gibi, bir sınıf birden fazla temel sınıftan türetilebilmektedir. Bu türetilme işlemine çoklu kalıtım adı verilmektedir. Çoklu kalıtımla türetilen bir sınıf, türetildiği tüm temel sınıfların özelliklerini miras olarak almaktadır. Çoklu kalıtımın sözdimi de tekli kalıtımda kullanılana benzemektedir.

Çok Düzeyli Kalıtım

Python programlama dilinde türetilmiş bir sınıftan kalıtım ile yeni bir sınıf oluşturulabilir. Bu duruma çok düzeyli kalıtım adı verilmektedir. Bu kalıtım türünde herhangi bir derinlik sınırı bulunmamaktadır. Kalıtım ile aynı şekilde, tüm türetilmiş sınıfların ve temel sınıfın özellikleri yeni oluşturulan sınıfa kalıtım ile aktarılmaktadır.

Metot Ayrıştırma İşlemi

Python programlama dilinde unutulmaması gereken bir nokta da, her sınıfın nesne sınıfından türetildiğidir. Nesne (object) sınıfı, en temel tür olarak da bilinir. İster kullanıcı tarafından oluşturulmuş, ister de yerleşik bir sınıf olsun, tüm bu sınıflar türetilmiş birer sınıftır ve nesne sınıfının birer örneğidir.


Çoklu kalıtım durumunda, sınıfın sahip olduğu özellik veya metot ilk olarak geçerli sınıf içerisinde aranmaktadır. Eğer bulunamazsa, üst sınıflarda derinlik öncelikli olarak sol-sağ kalıtım şeklinde aramaya devam edilmektedir.

Çoklu kalıtım örneğinde arama sırası şu şekilde olacaktır: [ AltSınıf, AnaSınıf1, AnaSınıf2, object ] Bu sıralamaya, çoklu kalıtım sınıfının doğrusallaştırılması adı verilmektedir. Ayrıca bu sıralama bulunurken kullanılan kural kümesine de Metot Ayrıştırma Sırası (Method Resolution Order-MRO ) adı verilmektedir.

MRO, bir sınıfın her zaman türetildiği sınıfların önünde bulunmasını sağlamaktadır. Bir sınıfın MRO verisi, __mro__ veya mro() fonksiyonları yardımı ile görüntülenebilmektedir. __mro__ bir demet verisi döndürürken, mro() ise bir liste döndürmektedir.

Geçersiz Kılma Yöntemleri (Overriding)

Ana sınıftan kalıtım ile türetilmiş bir alt sınıf, ana sınıfın tüm özelliklerine ve metotlarına sahip olacaktır. Fakat kimi durumlarda bu metotların yeni oluşturulan sınıfa özel hale getirilmesi gerekmektedir. Ana sınıftan kalıtım yoluyla geçen metotlar aynı isimle tekrar tanımlandığında, ana sınıftaki metot geçersiz hale gelecektir. Bu işleme ezme, geçersiz kılma adı verilmektedir.

Operatör Aşırı Yüklemesi (Overloading)

Temel işlem operatörleri, farklı türler için farklı şekilde davranış sergilemektedir. Örneğin “+” operatörü iki sayı için toplama işlemi yaparken, iki metin ifadesini/dizeyi birbirine ekler veya iki listeyi birleştirir. “+” operatörü kullanılan bir işlemde, yorumlayıcı arka planda __add__ metodunu otomatik olarak çağırmaktadır. Bu metot üzerinde ihtiyaca göre değişiklik yapılabilir. Aynı operatörün işlem yapılan türlere göre farklı davranışlar göstermesine operatörlerin aşırı yüklenmesi denmektedir (kitabınızın 205. Sayfasındaki tablo 6.1’de Temel aşırı yükleme metotlarını inceleyebilirsiniz).

Karşılaştırma Operatörlerinde Aşırı Yükleme

Python programlama dilinde operatörlerin aşırı yüklemesi, aritmetik operatörlerin yanında karşılaştırma operatörleriyle de yapılabilmektedir.

Veri Gizleme (Data Encapsulation)

Nesne yönelimli programlamada verilerin kod içerisinde gizlenmesi için kullanılan bir yöntemdir. Nesne bütünlüğü korunarak, sınıfın üyelerine sınırlı bir erişim verilir. Veri gizlemede, sınıf dışından verilere, metot ve özelliklere doğrudan erişim kısıtlanarak tek bir birim altında toplanmaktadır.

Nesne yönelimli programlamada bir yazılım geliştirme tekniği olarak verilere özel erişim sağlanır, sınıf dışarısından izinsiz bir şekilde verilerin değiştirilmesi önlenmektedir. Sınıf üyelerindeki bu sınırlı karşılıklı bağımlılıklar, sistem karmaşıklığını azaltarak programın

daha sağlam ve güvenli bir şekilde hazırlanmasına yardımcı olmaktadır.

Veri gizleme, bilgi gizleme ya da veri kapsülleme olarak da isimlendirilmektedir. Ayrıca veri kapsülleme uygulama detaylarını kullanıcılardan gizlemek için de kullanılır. Sınıf içerisindeki bir özellik özel “private” olarak belirtildiğinde, sadece o sınıf içerisinden erişilebilir, sınıf dışından erişilemez.

Python programlama dilinde veri kapsülleme, özellik adından önce önek olarak çift altçizgi “__” eklenerek yapılmaktadır. Bu özelliklerin sonlarına da en fazla bir adet altçizgi eklenebilir. Böylece, özellik özel/erişilemez hale gelir ve kullanıcıdan gizlenir.

Python yorumlayıcısı, dahili olarak değişkenlerin isimlerini sınıf adını da içerecek şekilde değiştirerek bu üyeleri korumaktadır.

Veri Gizlemenin Faydaları:

• Gizlenmiş verilere, kötü niyetli kişilerin erişimi engellenerek güvenlik arttırılır • Sınıf içindeki nesnelerin kendileri ile ilgisi olmayan veriler ile bağlantısı kesilir • Programcıyı yanlışlıkla ilgisiz verilere bağlanmasını engeller. Kod içinde kullanılan veriler hata vererek programcıyı uyararak düzeltmesini sağlar • Nesne yönelimli programlamanın temel konsepti olarak nesnelerin izolasyonunu sağlar • Geçici verileri kullanıcılardan gizleyerek olası zararların önüne geçilir

Veri Gizlemenin Zararları:

• Kimi zaman programcı fazladan kod yazmak zorunda kalabilir, bu da programcının işini zorlaştırır ve yazılan kodu uzatarak hataya daha açık hale getirir • Veriler arasındaki bağlantı, nesnelerin daha hızlı çalışmasını sağlarken veri gizleme bu bağlantıyı engeller

Çöp Toplama (Garbage Collection)

Python programlama dilinde bellek ayırma ve ayrılan belleği serbest bırakma/temizleme işlemleri otomatik olarak yapılmaktadır. C ve C++ gibi dillerindeki gibi belleğin ayrılması ve serbest bırakılması işlemlerinin programcı tarafından yapılmasına gerek kalmamaktadır. Python dilinde bellek ayrılması için iki yöntem kullanılmaktadır.

• Referans sayımı • Çöp toplama

Python 2.0 sürümünden önce, Python yorumlayıcısında bellek yönetimi için sadece referans sayım işlemi kullanılmaktaydı. Referans sayımı, bir nesneye sistemdeki diğer nesneler tarafından kaç kez referans verildiğini saymaktadır. Nesneye yapılan referanslar kaldırıldığında,


nesneye ait referans sayısı bir azaltılır ve bu sayı sıfır olduğunda, nesne serbest bırakılır.

Farklı bir durum olarak, nesnenin referans sayısına ulaşılamadığı durumlarda referans döngüsü oluşmaktadır. Liste, demet, sınıf örnekleri, sınıflar, fonksiyon ve sözlükleri içeren referans döngüleri yaygındır. Bir referans döngüsü oluşturmanın en kolay yolu, kendi kendine başvuran bir nesne oluşturmaktır.

Döngülerde Otomatik Çöp Toplama

Referans döngülerinin bulunması hesaplama gerektirdiği için çöp toplama işlemi zamanlanmış bir aktivite olarak gerçekleştirilmektedir. Python, çöp toplama işlemini nesnelere hafızadan yer ayırma ve hafızadaki yeri serbest bırakma eşiğine göre zamanlamaktadır. Hafızada ayrılan yer sayısı ile serbest bırakılan yer sayısı arasındaki fark, eşik sayısından büyük olduğunda çöp toplayıcı çalıştırılmaktadır. Eşik değeri, gc modülü yardımı ile incelenebilir. get_threshold() fonksiyonu ile mevcut koleksiyon eşik değerleri görülebilmektedir.

Çöp Toplayıcının Elle Tetiklenmesi

Python programlama dili, arka planda geliştiriciler için bir dizi düşük seviyeli ayrıntıyı işleyen yüksek seviyeli bir dildir. Böylece kod geliştiricilerin üretkenlikleri de artmaktadır. Python kodu içerisinde çöp toplayıcı programcı tarafından da çağrılabilir. Fakat genel bir kural olarak arka planda gerçekleştirilen işlemlere manuel bir müdahalede bulunmak gereksizdir ve tavsiye edilmez. Ayrıca bu gibi müdahaleler programcıya istediği sonuçları vermeyebilir.

Bu ünitenin sorularını uygulamada çözŞıklar, doğru cevaplar ve süreli sınav modu AÖF Soru Bankası uygulamasında