Peki biz bir sınıfı örneklemezsek ne olur? Eğer bir sınıfı örneklemezsek, o örneklenmeyen sınıf program tarafından otomatik olarak "çöp toplama" (garbage collection) adı verilen bir sürece tabi tutulacaktır. Burada bu sürecin ayrıntılarına girmeyeceğiz. Ama kısaca şöyle anlatabiliriz: Python'da (ve bir çok programlama dilinde) yazdığımız programlar içindeki "işe yaramayan" veriler bellekten silinir. Böylece etkili bir hafıza yönetimi uygulanmış ve programların performansı artırılmış olur. Mesela: a = 5 a = a + 6 print a 11 Burada "a" değişkeninin gösterdiği "5" verisi, daha sonra gelen "a = a + 6" ifadesi nedeniyle boşa düşmüş, ıskartaya çıkmış oluyor. Yani "a = a + 6" ifadesi nedeniyle, "a" değişkeni artık "5" verisini göstermiyor. Dolayısıyla "5" verisi o anda bellekte boşu boşuna yer kaplamış oluyor. Çünkü "a = a + 6" ifadesi yüzünden, "5" verisine gönderme yapan, onu gösteren, bu veriye bizim ulaşmamızı sağlayacak hiç bir işaret kalmamış oluyor ortada. İşte Python, bir veriye işaret eden hiç bir referans kalmadığı durumlarda, yani o veri artık işe yaramaz hale geldiğinde, otomatik olarak "çöp toplama" işlemini devreye sokar ve bu örnekte "5" verisini çöpe gönderir. Yani artık o veriyi bellekte tutmaktan vazgeçer. İşte eğer biz de yukarıda olduğu gibi sınıflarımızı "örneklemezsek", bu sınıflara hiçbir yerde işaret edilmediği, yani bu sınıfı gösteren hiçbir "referans" olmadığı için, sınıfımız oluşturulduğu anda çöp toplama işlemine tabi tutulacaktır. Dolayısıyla artık bellekte tutulmayacaktır. "Çöp Toplama" işlemini de kısaca anlattığımıza göre artık kaldığımız yerden yolumuza devam edebiliriz... Bu arada dikkat ettiyseniz sınıfımızı örneklerken parantez kullandık. Yani şöyle yaptık: deneme = IlkSinif() Eğer parantezleri kullanmazsak, yani "deneme = IlkSinif" gibi bir şey yazarsak, yaptığımız şey "örnekleme" olmaz. Böyle yaparak sınıfı sadece kopyalamış oluruz... Bizim yapmak istediğimiz bu değil. O yüzden, "parantezlere dikkat!" diyoruz... Artık şu komut yardımıyla, sınıf örneğimizin niteliklerine ulaşabiliriz: >>>deneme.mesele Olmak ya da olmamak Niteliklere Değinme (Attribute References) Biraz önce nitelik diye bir şeyden söz ettik. İngilizcede attribute denen bu nitelik kavramı, Pythondaki nesnelerin özelliklerine işaret eder. Python'un yazarı Guido Van Rossum bu kavram için şöyle diyor: "I use the word attribute for any name following a dot" (Noktadan sonra gelen bütün isimler için ben "nitelik" kelimesini kullanıyorum) kaynak:
9. Classes — Python v2.7.3 ********ation Bu tanıma göre, örneğin, >>>deneme.mesele dediğimiz zaman, buradaki mesele; deneme adlı sınıf örneğinin (instance) bir niteliği (attribute) oluyor. Biraz karışık gibi mi? Hemen bir örnek yapalım o halde: class Toplama: a = 15 b = 20 c = a + b 1. İlk satırda Toplama adlı bir sınıf tanımladık. Bunu yapmak için class parçacığından yararlandık. 2. Sırasıyla; a, b ve c adlı üç adet değişken oluşturduk. c değişkeni a ve b değişkenlerinintoplamıdır. Bu sınıftaki a, b ve c değişkenleri ise, Toplama sınıf örneğinin (örneği biraz sonra tanımlayacağız) birer niteliği oluyor. Bundan önceki örneğimizde ise "mesele" adlı değişken, "deneme" adlı sınıf örneğinin bir niteliği idi... Bu sınıfı yazıp kaydettiğimiz dosyamızın adının matematik.py olduğunu varsayarsak; from matematik import * komutunu verdikten sonra şunu yazıyoruz: >>>sonuc = Toplama() Böylece Toplama adlı sınıfımızı örnekliyoruz. Bu işleme örnekleme (instantiation) adı veriyoruz. sonuc kelimesine ise Python'cada örnek (instance) adı veriliyor. Yani sonuc, Toplama sınıfının bir örneğidir, diyoruz
Artık, sonuc.a sonuc.b sonuc.c biçiminde, "sonuc" örneğinin niteliklerine tek tek erişebiliriz. Peki kodları şöyle çalıştırırsak ne olur? import matematik Eğer modülü bu şekilde içe aktarırsak (import), sınıf örneğinin niteliklerine ulaşmak için şu yapıyı kullanmamız gerekir: matematik.sonuc.a matematik.sonuc.b matematik.sonuc.c Yani her defasında dosya adını (ya da başka bir ifadeyle modülün adını) da belirtmemiz gerekir. Bu iki kullanım arasında, özellikle sağladıkları güvenlik avantajları/dezavantajları açısından başka bazı temel farklılıklar da vardır, ama şimdilik konumuzu dağıtmamak için bunlara girmiyoruz
Ama temel olarak şunu bilmekte fayda var: Genellikle tercih edilmesi gereken yöntem "from modül import *" yerine "import modül" biçimini kullanmaktır. Eğer "from modül import *" yöntemini kullanarak içe aktardığınız modül içindeki isimler (değişkenler, nitelikler), bu modülü kullanacağınız dosya içinde de bulunuyorsa isim çakışmaları ortaya çıkabilir... Esasında, "from modül import *" yapısını sadece ne yaptığımızı çok iyi biliyorsak ve modülle ilgili belgelerde modülün bu şekilde içe aktarılması gerektiği bildiriliyorsa kullanmamız yerinde olacaktır. Mesela Tkinter ile programlama yaparken rahatlıkla "from Tkinter import *" yapısını kullanabiliriz, çünkü Tkinter bu kullanımda problem yaratmayacak şekilde tasarlanmıştır. Yukarıda bizim verdiğimiz örnekte de "from modül import *" yapısını rahatlıkla kullanıyoruz, çünkü şimdilik tek bir modül üzerinde çalışıyoruz. Dolayısıyla isim çakışması yaratacak başka bir modülümüz olmadığı için "ne yaptığımızı biliyoruz!"... Yukarıda anlattığımız kod çalıştırma biçimleri tabii ki, bu kodları komut ekranından çalıştırdığınızı varsaymaktadır. Eğer siz bu kodları IDLE ile çalıştırmak isterseniz, bunları hazırladıktan sonra F5 tuşuna basmanız, veya Run > Run Module yolunu takip etmeniz yeterli olacaktır. F5e bastığınızda veya Run > Run Module yolunu takip ettiğinizde IDLE sanki komut ekranında from matematik import * komutunu vermişsiniz gibi davranacaktır. Veya GNU/Linux sistemlerinde sistem konsolunda python -i sinif.py komutunu vererek de bu kod parçalarını çalıştırılabilir duruma getirebiliriz. Bu komutu verdiğimizde "from sinif import *" komutu otomatik olarak verilip hemen ardından Python komut satırı açılacaktır. Bu komut verildiğinde ekranda göreceğiniz ">>>" işaretinden, Python'un sizden hareket beklediğini anlayabilirsiniz... Şimdi isterseniz buraya kadar söylediklerimizi şöyle bir toparlayalım. Bunu da yukarıdaki örnek üzerinden yapalım: class Toplama: a = 15 b = 20 c = a + b 1. Toplama adlı bir sınıf tanımlıyoruz. 2. Sınıfımızın içine istediğimiz kod parçalarını ekliyoruz. Biz burada üç adet değişken ekledik. Bu değişkenlerin her birine, nitelik adını veriyoruz. 3. Bu kodları kullanabilmek için Python komut satırında şu komutu veriyoruz: from matematik import * Burada modül adının (yani dosya adının) matematik olduğunu varsaydık. 4. Şimdi yapmamız gereken şey, Toplama adlı sınıfı örneklemek (instantiation). Yani bir nevi, sınıfın kendisini bir değişkene atamak. Bu değişkene biz Pythoncada örnek (instance) adını veriyoruz. Yani, sonuc" adlı değişken, Toplama adlı sınıfın bir örneğidir diyoruz (sonuc is an instance of Toplama). >>>sonuc = Toplama() 5. Bu komutu verdikten sonra niteliklerimize erişebiliriz: >>>sonuc.a >>>sonuc.b >>>sonuc.c Dikkat ederseniz, niteliklerimize erişirken örnekten (instance), yani sonuc adlı değişkenden yararlanıyoruz. Şimdi bir an bu sınıfımızı örneklemediğimizi düşünelim. Dolayısıyla bu sınıfı şöyle kullanmamız gerekecek: >>>Toplama().a >>>Toplama().b >>>Toplama().c Ama daha önce de anlattığımız gibi, siz "Toplama().a" der demez sınıf çalıştırılacak ve çalıştırıldıktan hemen sonra ortada bu sınıfa işaret eden herhangi bir referans kalmadığı için Python tarafından "işe yaramaz" olarak algılanan sınıfımız çöp toplama işlemine tabi tutularak derhal belleği terketmesi sağlanacaktır. Bu yüzden bunu her çalıştırdığınızda yeniden belleğe yüklemiş olacaksınız sınıfı. Bu da bir hayli verimsiz bir çalışma şeklidir. Böylelikle zor kısmı geride bırakmış olduk. Artık önümüze bakabiliriz. Zira en temel bazı kavramları gözden geçirdiğimiz ve temelimizi oluşturduğumuz için, daha karışık şeyleri anlamak kolaylaşacaktır. alıntı