Perguntei-me se seria possível evitar algumas das desvantagens do uso de variáveis globais (veja, por exemplo, http://wiki.c2.com/?GlobalVariablesAreBad ) usando um espaço de nome de classe em vez de um espaço de nome global / módulo para passar valores de variáveis . O código a seguir indica que os dois métodos são essencialmente idênticos. Há uma pequena vantagem no uso de namespaces de classe, conforme explicado abaixo.
Os fragmentos de código a seguir também mostram que atributos ou variáveis podem ser criados e excluídos dinamicamente nos espaços de nomes globais / de módulo e de classe.
wall.py
# Note no definition of global variables
class router:
""" Empty class """
Eu chamo esse módulo de 'parede', pois ele é usado para devolver variáveis. Ele atuará como um espaço para definir temporariamente variáveis globais e atributos de toda a classe do 'roteador' da classe vazia.
source.py
import wall
def sourcefn():
msg = 'Hello world!'
wall.msg = msg
wall.router.msg = msg
Este módulo importa parede e define uma única função sourcefn
que define uma mensagem e a emite por dois mecanismos diferentes, um via global e outro via função de roteador. Observe que as variáveis wall.msg
e wall.router.message
são definidas aqui pela primeira vez em seus respectivos namespaces.
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'
Este módulo define uma função destfn
que usa os dois mecanismos diferentes para receber as mensagens emitidas pela fonte. Permite a possibilidade de a variável 'msg' não existir.destfn
também exclui as variáveis depois que elas são exibidas.
main.py
import source, dest
source.sourcefn()
dest.destfn() # variables deleted after this call
dest.destfn()
Este módulo chama as funções definidas anteriormente em sequência. Após a primeira chamada para dest.destfn
as variáveis wall.msg
e wall.router.msg
não existe mais.
A saída do programa é:
global: Olá mundo!
roteador: Olá mundo!
global: nenhuma mensagem
roteador: nenhuma mensagem
Os fragmentos de código acima mostram que os mecanismos de módulo / global e de variável de classe / classe são essencialmente idênticos.
Se muitas variáveis devem ser compartilhadas, a poluição do namespace pode ser gerenciada usando vários módulos do tipo parede, por exemplo, wall1, wall2 etc. ou definindo várias classes do tipo roteador em um único arquivo. O último é um pouco mais organizado, então talvez represente uma vantagem marginal para o uso do mecanismo de variável de classe.