Sizi sınıflar ile tanışmadan önce, biraz da Python'un etki alanı kurallarından
bahsetmem gerek. Sınıf tanımlamalarını tam olarak anlamak için etki ve isim
alanlarının nasıl çalıştığını bilmeniz gerek. Bu konudaki bilgiler ileri
seviyedeki her Python programcısı için yaralıdır.
Birkaç tanım ile işe koyulalım.
Bir isim alanı isimler ile nesnelerin eşleşmesidir.
Çoğu isim alanı şu anda Python sözlükleri olarak kodlanmışlardır, fakat bu
hiçbir şekilde fark edilmez ve gelecekte değiştirilebilir. İsim alanlarına
örnekler: yerleşik isimler kümesi (abs() gibi işlevler
ve yerleşik istisna isimleri vs.), bir modül içindeki global isimler ve
bir işlev çağrısındaki yerel isimler. Bir nesnenin özellikler kümesi de
bir isim alanıdır. İsim alanlarına ilişkin bilinecek önemli şey farklı
isim alanlarındaki isimlerin birbirileri ile hiçbir ilişkisi olmadığıdır.
Örneğin, iki farklı modül karışıklık yaratmadan “maksimize” adlı birer
işlev tanımlayabilir; kullanıcılar bu işlevleri önlerine modül adını
ekleyerek kullanırlar.
Bu arada, bir noktadan sonra yazılan her herhangi bir isim için
öznitelik
sözcüğünü kullanıyorum. Örneğin,
z.real ifadesinde
real,
z nesnesinin bir özniteliğidir.
Modül içindeki isimlere atıflar da öznitelik atıflarıdır:
modulAdi.fonkAdi ifadesinde
modulAdi
bir modül nesnesidir ve
fonkAdi bunun bir özniteliğidir.
Bir modülün öznitelikleri ile içinde tanımlı global değişkenler aynı isim
alanını paylaşırlar.
[88]
öznitelikler salt okunur veya yazılabilir olabilirler. Yazılabilir oldukları
durumda özniteliklere atama yapmak mümkündür. Modül öznitelikleri yazılabilirdir:
modulAdi.sonuc = 42 gibi bir ifade kullanabilirsiniz.
Yazılabilir öznitelikleri del deyimini kullanarak silmek de
mümkündür. Örneğin del modulAdi.sonuc ifadesi
modulAdi nesnesinden sonuc isimli özniteliği siler.
Farklı anlarda yaratılan isim alanlarının farklı ömürleri olur. Yerleşik
isimleri içeren isim alanı Python yorumlayıcısı çalıştırıldığında yaratılır
ve asla silinmez. Bir modüle ait global isim alanı modül tanımı okunduğunda
yaratılır ve genellikle yorumlayıcı çalıştığı sürece silinmez. Yorumlayıcının
bir dosyadan veya etkileşimli olarak çalıştırdığı deyimler de
__main__ isimli bir modüle ait kabul edilir ve bunların
da kendi global isim alanı vardır. Yerleşik isimler de __builtin__
isimli bir modülde bulunurlar.
Bir işleve ait yerel isim alanı işlev çağırıldığında yaratılır ve işlevden
dönüldüğünde veya işlev içinde ele alınmamış bir istisna gerçekleştiğinde
silinir. Tabii ki özyinelemeli çağrıların herbiri kendi yerel isim alanına
sahiptir.
Bir etki alanı bir isim alanının doğrudan erişilebildiği bir
metin bölgesidir. Burada “doğrudan erişilebilir” ifadesinin anlamı, yetersiz bir
isim atfının isim alanında isim bulmaya teşebbüs etmesidir.
Etki alanları statik olarak belirlenmelerine rağmen, dinamik olarak
kullanılırlar. İcranın herhangi bir anında isim alanlarına doğrudan
erişilebilen iç içe geçmiş en az üç etki alanı vardır: ilk aranan ve yerel
isimleri içeren en iç etki alanı; en yakın olanından başlanarak aranan
çevreleyen işlevlerin isim alanları; daha sonra aranan ve o andaki modülün
global değişkenlerini içeren orta etki alanı; ve yerleşik isimlerin bulunduğu
isim alanı olan en dış etki alanı (en son aranır).
Eğer bir isim global olarak tanımlanmış ise tüm atıflar ve atamalar doğrudan
modülün global isimlerini barındıran orta etki alanına giderler. Zaten,
en iç etki alanının dışındaki tüm isimler salt okunurdur.
Genellikle yerel etki alanı o an içinde bulunulan (program metninde) işlevin
yerel isimlerine atıfta bulunur. İşlevlerin dışında yerel etki alanı global
etki alanı ile aynı isim alanıdır: modülün isim alanı. Sınıf tanımlamaları
ayrıca yerel etki alanı içerisine bir başka isim alanı daha eklerler.
Etki alanlarının metne bağlı olarak belirlendiğini anlamak önemlidir. Bir
modül içinde tanımlı bir işlevin global etki alanı o modülün isim alanıdır;
nereden çağırıldığı ya da hangi farklı isim ile çağırıldığı bir fark yaratmaz.
Diğer yandan, asıl isim araması icra anında dinamik olarak yapılır; ancak
dilin tanımı “derleme” sırasında yapılan statik isim çözümlemeye doğru
değişmektedir ve dinamik isim çözümlemeye güvenmemelisiniz! Örneğin, yerel
değişkenler şu anda statik olarak belirlenmektedir.
Python'a özgü bir tuhaflık da atamaların her zaman en iç etki alanına gitmesidir.
Atamalar veri kopyalamaz; sadece nesnelere isimler bağlarlar. Aynı şey silme
işlemleri için de geçerlidir: del x ifadesi x'in
yerel etki alanı tarafından atfedilen isim alanındaki bağını kaldırır.
Aslında, yeni isimler yaratan tüm işlemler yerel etki alanını kullanırlar.
İşlev tanımları ve import deyimleri modül veya işlev adını
yerel etki alanına bağlarlar. Bir değişkenin global etki alanında bulunduğunu
belirtmek için global deyimi kullanılabilir.