Python Etki ve İsim Alanları
Önceki Sınıflar Sonraki
Python Etki ve İsim Alanları
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.


[88] Buna bir istisna: modül nesnelerinin, modülün isim alanını oluşturmada kullanılan sözlüğü oluşturan __dict__isimli salt okunur ve gizli bir özniteliği vardır. __dict__ bir özniteliktir fakat global bir isim değildir.
Önceki Üst Ana Başlık Sonraki
Terminoloji hakkında... Başlangıç Sınıflara İlk Bakış
Bir Linux Kitaplığı Sayfası