AÖF Soru Bankası

Programlama IIÜnite 6 Soru-Cevap

Programlama II (BIL203U) soru-cevapları.

Nesne yönelimli programlama dilinin özellikleri nelerdir? Nesne yönelimli programlama hangi öncelikli hedeflere odaklanmaktadır?

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 programlamada sınıf terimini açıklayınız.

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. Örnekte, sınıf bir şablonu, araç ise bir nesneyi temsil etmektedir.

Kod:

class Araç:

                  pass

Örnek kodda, boş bir Araç sınıfı tanımlamak için class anahtar sözcüğü kullanılmıştır. Sınıftan oluşturulan örnekler (instance) belirli birer nesnedir.

Aşağıdaki kod çıktısı ne olacaktır? Açıklayınız.

Kod Çıktısı:

Spor araç binek

SUV araç da binek

Kırmızı aracın yakıtı Benzin

Beyaz aracın yakıtı ise Dizel

Örnek programda Araç adında bir sınıf oluşturularak nesnenin özellikleri olan öznitelikleri tanımlanmıştır. Bu nitelikler, sınıfın __init__ metodu içinde tanımlanmaktadır. Bu metot başlatıcı metot olarak adlandırılır. Yani nesne oluşturulur oluşturulmaz ilk çalıştırılan metottur. Ardından Araç sınıfından spor ve suv isimli nesneler oluşturulmuştur. Sınıfların özelliklerine de __ class__.tür metodu kullanılarak erişilmektedir. Sınıf nitelikleri, bir sınıfın tüm örnekleri için aynıdır. Benzer şekilde, spor.renk ve spor.yakıt kullanarak sınıf örneğinin niteliklerine erişilebilir. Ancak, bir sınıfın her örneği için atanan değerler farklıdır.

Aşağıdaki kod bloğundaki sınıf ve metodları açıklayınız.

Soru kökündeki kodda, Selamlama isminde bir sınıf tanımlanmış ve bu sınıfta da “selam” isminde bir metot oluşturulmuştur. Bu metoda da sınıftan türetilen bir nesne üzerinden erişilebildiği için bu metotlara örnek metotları (instance methods) denilmektedir.

Python'da kalıtım kavramını açıklayınız.

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.

Örnek kod bloğunda değişken ve metotlara erişim kısıtlaması yapılmıştır. Python'da buna ne ad verilir?

Python programlama dilinde nesne yönelimli programlama kullanılarak, değişken ve metotlara erişim kısıtlanabilmektedir. Bu kısıtlama işlemine kapsülleme adı verilmektedir 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.

Nesne yönelimli programlamada çok biçimlilik kavramını açıklayınız.

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.

Python'da sınıfların yerleşik özelliklerini listeleyiniz.

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.

Python'da sınıf içinde tanımlanan fonksiyonlar hangi anahtar kelimesi ile olmalıdır? Açıklayınız.

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.

Sınıf kalıtımı kavramını açıklayınız.

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.

Örnek kodda, Personel sınıfı tanımlanmış ve bu sınıfa ait isim ve soyisim özelliklerinin ilk değerleri yapıcı/kurucu metot üzerinden alınması sağlanmıştır. Daha sonra isimYazdır metodu ile personelin isminin yazdırılması sağlanmıştır. Personel sınıfından türetilen AkademikPersonel sınıfı ise, yapıcı metodunda türetildiği Personel sınıfının yapıcı metodunu çağırmıştır. Böylece kalıtım yoluyla kendisinin de kullanabildiği isim ve soyisim özelliklerine değer ataması yapılabilmesini sağlamıştır. Yapıcı metot içinde fazladan fakülte özelliği de eklenmiştir. Ayrıca isimYazdır metodu kendisine üst sınıfından kalıtım ile aktarılmıştır. Fakat aynı isimde yeni bir metot hazırlandığı için, üst metodun isimYazdır metodu geçersiz kılınmıştır ve AkademikPersonel sınıfından üretilen nesnelerde kullanılamaz. Örnek kodda, __init__() metodunun her iki sınıfta da tanımlandığı görülmekedir. Böyle bir durumda, türetilmiş sınıftaki metot, temel sınıftaki metodu geçersiz kılarak kendi tanımladığı metodu çağırır. Yine kurucu metot içerisinde, temel sınıfın kurucu metodu çağırılmıştır. Bu çağırma işlemi Personel.__init__(self, isim, soyisim) şeklinde gerçekleştirilmiştir. Bunun yerine eşdeğeri olan super().__ init__(isim, soyisim) şeklinde de çağrılabilmektedir. Buradaki super() fonksiyonu, sınıfın türetilediği temel sınıfı göstermektedir.

Python'da çoklu kalıtım kavramını açıklayınız, söz dizimini gösteriniz.

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. Örnek şekilde söz dizimindeki kalıtım gösterilmiştir. AltSınıf, AnaSınıf1 ve AnaSınıf2 sınıflarından türetilmiştir. 

Python'da geçersiz kılma yöntemi hangi durumlarda kullanılır?

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 kavramını açıklayınız.

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.

Aşağıdaki aşırı yükleme metotlarını açıklayarak örnek kullanımlarını gösteriniz:

* __init__( self [, args…] )

* __cmp__( self, x )

* __str__( self )

* __repr__( self )

* __del__( self )20

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.

Aşağıdaki kod bloğunun çıktısı ne olacaktır, açıklayınız.

Soru kökündeki kodda “+” operatörüne farklı bir görev yüklenerek, daha önceki görevinden farklı bir işlem gerçekleştirmesi sağlanmıştır. “+” operatöründeki ilk eleman ile ikinci elemanın 2 katı toplanmaktadır. Burada yapılacak işlem tamamen ihtiyaca yöneliktir. Dikkat edilmesi gereken bir nokta da, bu aşırı yüklenmiş operatörün sadece bu sınıf için yapılan toplama işlemlerinde geçerli olduğudur. Örnek kodda son satırda yapılan işlem, standart toplama işlemidir ve aşırı yüklenmiş metot kullanılmamıştır. 

Nesne yönelimli programlamada Veri gizleme (Data Encapsulation) yönteminin amacını açıklayınız.

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.

Nesne yönelimli programlamada veri gizlemenin faydalarını ve zararlarını açıklayınız.

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.

Python'da bellek ayrılması için hangi yöntemler kullanılır?

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.

Örnek kod bloğu çalıştırıldığında referans değerlerinin ne olacağını açıklayınız.

Örnek kodu incelediğimizde, 2.satırda 26 değeri bir nesne olarak oluşturulmuştur ve referans değeri 1 olarak ayarlanır. 5.satırda 44 değeri atandığı için 26 değerine referans bir azaltılarak 0 olur ve çöp toplayıcı tarafından 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.

Python'da döngülerde otomatik çöp toplama işleminin mantığını açıklayınız.

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.

Örnek kodda çalıştırılan fonksiyon sonucu elde edilen 700, sistemdeki varsayılan eşik değeridir. Hafızada ayrılan yer sayısı ile serbest bırakma sayısı arasındaki fark 700’den fazla olduğunda, otomatik çöp toplama işlemi gerçekleştirileceği anlamına gelmektedir.

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