Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

FilhoDoSol

Objectos em Python

Mensagens Recomendadas

FilhoDoSol

Boa noite,

pareço com nabo a tentar perceber a maneira como o python lida com os objectos.

Eu defini 3 classes num dos meus modules. Essas classes são inicializadas uma e uma só vez, e quero que sejam usadas em vários modules ao longo da execução do meu programa. No entanto, não queria estar a passar o objecto por paramêtro até onde precisar desse objecto.

Por essa razão, decidi criar 3 variáveis globais num dos modules. Assim, no inicio criava os objectos, e apontava essas três variáveis para esses objectos. Depois, cada vez que precisase de mexer nesses objectos era só fazer import do module onde elas estão definidas.

Isto não funciona, e eu entendo +/- porquê. Quando tento usar essas variáveis noutro module, estes não "adivinham" que aquela variável é do objecto que especifiquei anteriormente e por isso não o IDE não me dá acesso aos métodos dessa classe.

Alguém me ajuda a resolver esta situação?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
FilhoDoSol

Module 1

# 'singleton' classes used by all scripts
environmentRepresentation = None
class EnvironmentVariables (object):
filename = "environment.txt"
def __init__ (self):
    self.username = None
    self.passwd = None
    self.package_directory = None
    self.mysql_root = None
    self.parseEnvironmentFile()
def parseEnvironmentFile(self):
    environmentFile = open (EnvironmentVariables.filename, "r+")
    lines = environmentFile.readlines()
    for singleLine in lines:
        if singleLine[0] != '#' and singleLine != "\n":
            singleLine = removeNewLine (singleLine)
            splittedLine = singleLine.split (" ")
            if splittedLine[0] == "USERNAME":
                self.username = splittedLine[1]
            elif splittedLine[0] == "PASSWORD":
                self.passwd = splittedLine[1]
            elif splittedLine[0] == "PACKAGE_DIRECTORY":
                self.package_directory = splittedLine[1]
            elif splittedLine[0] == "MYSQL_ROOT":
                self.mysql_root = splittedLine[1]

No outro module faço o seguinte:

## parse txt's at the beggining ##
environmentRepresentation = EnvironmentVariables()
environmentRepresentation.

Pronto, e neste module, não consigo aceder às variáveis/métodos.

Tenho uns deployments para fazer e escolhi python porque sei que é uma linguagem rápida de progamar. Além disso comecei a aprender python hoje. :P

Por isso provavelmente isto é uma gralha fácil de resolver.

EDITED:

Odeio-me neste momento.

A culpa não era minha, "era do IDE". O IDE é que não me faz o auto-complete. :D

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
FilhoDoSol

EDITED_2:

Afinal isto ainda não está como eu quero..

As variáveis globais do module são "reseted" a cada import que faço. Ou seja, eu iniciei as variáveis num dos scripts, e mais tarde, ao fazer import do module que contém as variáveis noutro lado, a variável está "limpa", e tenho que a iniciar outra vez.

Como ultrapasso isto?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Se bem percebi o que pretendes é um singleton.

Numa pesquisa que fiz, a sugestão que dão é usar um módulo (a menos que precises de subclasses, mas se precisares de subclasses os singletons também podem dar problemas).

Um vídeo sobre o assunto que encontrei entretanto:

https://www.youtube.com/embed/0vJJlVBVTFg?start=877&feature=oembed

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
FilhoDoSol

O video é excelente. Obrigado.

Entretanto ontem acabei por resolver da seguinte maneira:

def getBenchmarkSpecs():
global specs
if not specs:
    specs = BenchmarkSpecs()
return specs

e cada vez que preciso de aceder ao objecto chamo esse método, de qualquer ponto do código. Cumpre aquilo que quero, mas vou fazer umas modificações, tal como recomenda o video.

Cumps. ;)

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.