Sınıflara İlk Bakış
Önceki Sınıflar Sonraki
Sınıflara İlk Bakış
Sınıflar ile bir miktar yeni sözdizim ve kavram ile üç yeni nesne türü tanıtacağız.
Sınıf Tanımlama
Sınıf tanımlamanın en basit şekli şöyledir:
class SinifAdi:
    <deyim-1>
    .
    .
    .
    <deyim-N>
Sınıf tanımlamaları, işlev tanımlamalarında (def deyimleri) olduğu gibi etkin olmaları için önce işletilmeleri gerekir. (Yanlışlıkla sınıf tanımlarını if deyimleri veya işlev içlerine koymamaya dikkat edin.)
Pratikte bir sınıf tanımının içindeki deyimler genellikle işlev tanımları olur; fakat başka deyimler de kullanmak mümkün ve yararlıdır (buna daha sonra yine değineceğiz). Sınıf içindeki işlev tanımlarının argüman listesi kendilerine özgü bir şekle sahiptir; ancak buna da daha sonra değineceğiz.
Bir sınıf tanımına girildiğinde yeni bir isim alanı (name space) oluşturulur ve bu yerel etki alanı (scope) olarak kullanılır. Yerel değişkenlere yapılan bütün atamalar bu yeni isim alanına gider. Yeni tanımlanan işlevlerin isimleri de buraya eklenir.
Bir sınıf tanımı normal olarak tamamlandığında bir sınıf nesnesi yaratılmış olur. Bu, temel olarak, sınıf tanımının oluşturduğu isim alanı etrafında bir örtüdür. Sınıf nesnelerini bir sonraki bölümde daha yakından tanıyacağız. Orjinal etki alanı (sınıf tanımına girilmeden önce etkin olan) yine eski yerini alır ve sınıf nesnesi de buna sınıf tanımında kullanılan isim (örnekteki SinifAdi) ile dahil olur.
Sınıf Nesneleri
Sınıf nesneleri iki tür işlemi destekler: özniteliklere başvuru (attribute reference) ve sınıfın gerçeklenmesi (instantiation).
Özniteliklere başvuru için Python'da bütün özniteliklere erişmek için kullanılan standart sözdizim kullanılır: nesne.isim. Kullanılabilecek öznitelik isimleri sınıf nesnesi yaratılırken sınıfın isim alanında bulunan bütün isimlerdir. Sınıf tanımımız aşağıdaki gibi ise:
class benimSinif:
    "Basit bir sınıf örneği."
    i = 12345
    def f(self):
        return 'Merhaba'
benimSinif.i ve benimSinif.f bir tamsayı ve bir yöntem nesnesi geri döndüren geçerli öznitelik başvurularıdır. Sınıf özniteliklerine atama yapmak da mümkündür. Örneğin atama yoluyla benimSinif.i değeri değiştirilebilir. Ayrıca, __doc__ da geçerli bir öznitelik olup sınıfa ait belgeleme dizgesini geri döndürür: "Basit bir sınıf örneği.".
Sınıfın gerçeklenmesi, işlev sözdizimini kullanır. Sınıf nesnesini yeni bir sınıf gerçeklemesi geri döndüren parametresiz bir işlevmiş gibi düşünebilirsiniz. Örneğin yukarıda tanımladığımız sınıf için:
x = benimSinif()
Yeni bir sınıf gerçeklemesidir ve sınıf x yerel değişkenine atanarak bir nesne oluşur.
Gerçeklenme işlemi (bir sınıf nesnesini ``çağırmak'') boş bir nesne yaratır. Pek çok sınıf nesnesinin bilinen bir ilk durumda oluşturulması istenir. Bu yüzden bir sınıfta __init__() adlı özel yöntem şu şekilde tanımlanabilir:
def __init__(self):
    self.data = []
Bir sınıfın __init__() yöntemi tanımlanmış ise sınıf gerçeklenmesi işlemi, yeni sınıf gerçeklemesi sırasında bu yöntemi otomatik olarak çağırır.
Daha fazla esneklik için __init__() yönteminin argümanları da olabilir. Bu durumda sınıfın gerçeklenmesinde kullanılan argümanlar __init__() yöntemine aktarılır. [89] Örnek:
>>> class karmasikSayi:
...     def __init__(self, gercekKsm, sanalKsm):
...         self.g = gercekKsm
...         self.s = sanalKsm
...
>>> x = karmasikSayi(3.0, -4.5)
>>> x.g, x.s
(3.0, -4.5)
Nesneler (Gerçeklenen Sınıflar)
Nesnelerle ne yapabiliriz? Bunlar ile yapabileceğimiz tek şey öznitelikleri ile uğraşmaktır. Nesnelerin iki tür özniteliği vardır. Bunların ilki veri öznitelikleridir. Veri özniteliklerinin tanımlanmış olması gerekmez; yerel değişkenlerde olduğu gibi bunlar da kendilerine ilk atama yapıldığında var olurlar. Örneğin x'in yukarıda tanımlanan benimSinif sınıfının bir gerçeklemesi olduğunu düşünürsek aşağıdaki program parçası 16 değerini geride bir iz bırakmadan yazdırır:
x.sayac = 1
while x.sayac < 10:
    x.sayac = x.sayac * 2
print x.sayac
del x.sayac
Nesnelerin ikinci tür öznitelikleri de yöntemlerdir. Yöntem bir sınıfa “ait olan” bir işlevdir. Python dilinde yöntemler sınıf gerçeklemelerine özgü değildir; diğer nesne türlerinin de yöntemleri vardır (listeler, sözlükler vs.). Aşağıda yöntem terimini, aksi belirtilmediği sürece, sadece nesnelerin yöntemleri anlamında kullanacağız.
Bir nesneye ilişkin geçerli öznitelik isimleri bunun sınıfına bağlıdır. Tanıma göre işlev olan tüm sınıf öznitelikleri o nesnenin yöntemleri olur. Bu yüzden örnek sınıfımız için x.f geçerli bir yöntem başvurusudur, çünkü benimSinif.f bir işlevdir, fakat x.i bir yöntem değildir, çünkü benimSinif.i bir işlev değildir. Burada şuna dikkat edelim: x.f ile benimSinif.f aynı şey değildir.
Yöntem Nesneleri
Genellikle bir yöntem şu şekilde doğrudan çağırılır:
x.f()
Bizim örneğimizde bu 'Merhaba' dizgesini geri döndürür. Bir yöntemi doğrudan çağırmak şart değildir: x.f bir yöntemdir ve bir değişkene saklanıp daha sonra çağırılabilir. Örneğin:
xf = x.f
while 1:
    print xf()
Sonsuza kadar "'Merhaba'" yazdırır.
Bir yöntem çağrıldığında tam olarak ne olur? x.f() çağrılırken bir argüman kullanılmadığı halde f işlev tanımında bir argüman kullanıldığını (self)fark etmişsinizdir. Argümana ne oldu acaba? Şüphesiz Python, argüman gerektiren bir işlev argümansız çağırıldığında bir istisna oluşturur. Cevabı belki de tahmin ettiniz: yöntemler, işlevin ilk argümanı olarak nesneyi alırlar. Başka bir deyişle Python'da yöntemler, kendi içinde, tanımlı olduğu nesneyi barındıran nesnelerdir. Örneğimizdeki x.f() çağrısı aslında benimSinif.f(x) ile aynıdır. Genel olarak, bir yöntemi n elemanlı bir argüman listesi ile çağırmak, aynı işlevi başına nesnenin de eklendiği bir argüman listesi kullanarak çağırmak ile aynı şeydir.


[89] [Ç.N.]: Diğer nesne yönelimli programlama dillerinde bu işleme "nesnenin ilklendirilmesi" denir.
Önceki Üst Ana Başlık Sonraki
Python Etki ve İsim Alanları Başlangıç Bazı Açıklamalar
Bir Linux Kitaplığı Sayfası