Saya bertanya-tanya apakah mungkin untuk menghindari beberapa kerugian menggunakan variabel global (lihat misalnya http://wiki.c2.com/?GlobalVariablesAreBad ) dengan menggunakan namespace kelas daripada namespace global / modul untuk meneruskan nilai variabel . Kode berikut menunjukkan bahwa kedua metode pada dasarnya identik. Ada sedikit keuntungan dalam menggunakan ruang nama kelas seperti yang dijelaskan di bawah ini.
Fragmen kode berikut juga menunjukkan bahwa atribut atau variabel dapat dibuat dan dihapus secara dinamis di ruang nama global / modul dan ruang nama kelas.
wall.py
# Note no definition of global variables
class router:
""" Empty class """
Saya menyebut modul ini 'dinding' karena digunakan untuk memantulkan variabel. Ini akan bertindak sebagai ruang untuk sementara mendefinisikan variabel global dan atribut kelas-kelas dari 'router' kelas kosong.
source.py
import wall
def sourcefn():
msg = 'Hello world!'
wall.msg = msg
wall.router.msg = msg
Modul ini mengimpor dinding dan mendefinisikan satu fungsi sourcefn
yang mendefinisikan pesan dan memancarkannya dengan dua mekanisme berbeda, satu melalui global dan satu melalui fungsi router. Perhatikan bahwa variabel wall.msg
dan wall.router.message
didefinisikan di sini untuk pertama kalinya di ruang nama masing-masing.
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'
Modul ini mendefinisikan fungsi destfn
yang menggunakan dua mekanisme berbeda untuk menerima pesan yang dipancarkan oleh sumber. Ini memungkinkan kemungkinan bahwa variabel 'msg' mungkin tidak ada. destfn
juga menghapus variabel setelah ditampilkan.
main.py
import source, dest
source.sourcefn()
dest.destfn() # variables deleted after this call
dest.destfn()
Modul ini memanggil fungsi yang telah ditentukan sebelumnya secara berurutan. Setelah panggilan pertama ke dest.destfn
variabel wall.msg
dan wall.router.msg
tidak ada lagi.
Output dari program ini adalah:
global: Halo dunia!
router: Halo dunia!
global: tidak ada
router pesan : tidak ada pesan
Fragmen kode di atas menunjukkan bahwa modul / global dan mekanisme variabel kelas / kelas pada dasarnya identik.
Jika banyak variabel yang akan dibagikan, polusi namespace dapat dikelola baik dengan menggunakan beberapa modul tipe dinding, misalnya wall1, wall2 dll. Atau dengan mendefinisikan beberapa kelas tipe router dalam satu file. Yang terakhir ini sedikit lebih rapi, jadi mungkin mewakili keuntungan marjinal untuk penggunaan mekanisme variabel kelas.