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 sourcefnbir 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.msgve wall.router.messageburada 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, destfnkaynak 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. destfnayrı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.destfnDeğişkenlere ilk çağrıdan sonra wall.msgve wall.router.msgartı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.