Değişkenlerin değerlerini geçirmek için bir global / modül ad alanı yerine bir sınıf ad alanı kullanarak global değişkenleri kullanmanın bazı dezavantajlarından kaçınmanın mümkün olup olmadığını merak ettim (bkz. Http://wiki.c2.com/?GlobalVariablesAreBad ) . Aşağıdaki kod, iki yöntemin temelde aynı olduğunu gösterir. Sınıf ad alanlarını aşağıda açıklandığı gibi kullanmanın küçük bir avantajı vardır.
Aşağıdaki kod parçaları ayrıca özniteliklerin veya değişkenlerin dinamik olarak oluşturulabileceğini ve hem global / modül ad alanlarında hem de sınıf ad alanlarında silinebileceğini gösterir.
wall.py
# Note no definition of global variables
class router:
""" Empty class """
Değişkenleri geri döndürmek için kullanıldığı için bu modüle 'duvar' diyorum. Global değişkenleri ve boş 'yönlendirici' sınıfının sınıf çapında özniteliklerini geçici olarak tanımlamak için bir alan görevi görecektir.
source.py
import wall
def sourcefn():
msg = 'Hello world!'
wall.msg = msg
wall.router.msg = msg
Bu modül duvarı içe aktarır ve sourcefn
bir mesajı tanımlayan ve bunu biri küreseller ve diğeri yönlendirici işlevi aracılığıyla olmak üzere iki farklı mekanizma ile yayınlayan tek bir işlevi tanımlar. Değişkenlerin wall.msg
ve wall.router.message
burada ilk kez kendi ad alanlarında tanımlandığını unutmayın.
dest.py
import wall
def destfn():
if hasattr(wall, 'msg'):
print 'global: ' + wall.msg
del wall.msg
else:
print 'global: ' + 'no message'
if hasattr(wall.router, 'msg'):
print 'router: ' + wall.router.msg
del wall.router.msg
else:
print 'router: ' + 'no message'
Bu modül, destfn
kaynak tarafından gönderilen mesajları almak için iki farklı mekanizmayı kullanan bir işlevi tanımlar . 'Msg' değişkeninin mevcut olmaması olasılığına izin verir. destfn
ayrıca görüntülendikten sonra değişkenleri siler.
main.py
import source, dest
source.sourcefn()
dest.destfn() # variables deleted after this call
dest.destfn()
Bu modül, önceden tanımlanmış işlevleri sırayla çağırır. dest.destfn
Değişkenlere ilk çağrıdan sonra wall.msg
ve wall.router.msg
artık yok.
Programın çıktısı:
global: Merhaba dünya!
yönlendirici: Merhaba dünya!
genel: mesaj
yönlendirici yok: mesaj yok
Yukarıdaki kod parçaları, modül / global ve sınıf / sınıf değişken mekanizmalarının temelde aynı olduğunu gösterir.
Çok sayıda değişken paylaşılacaksa, ad alanı kirliliği, duvar1, duvar2 vb. Gibi birkaç duvar tipi modül kullanılarak veya tek bir dosyada çeşitli yönlendirici tipi sınıflar tanımlanarak yönetilebilir. İkincisi biraz daha derli topludur, bu nedenle belki de sınıf değişken mekanizmasının kullanımı için marjinal bir avantajı temsil eder.