Jump to content

[Resolvido] Questão sobre Classes


Davidox
 Share

Recommended Posts

Boas. Estou neste momento a aprender python na cadeira de programaçao, e tenho um trabalho entre maos. a questão é a seguinte, o prof. forneceu uma programa com uma funçao que testa se as minhas funcoes estão correctas. Agora gostava de saber se é possivel executar um comando deste genero:

mapa().mapa_poe_objecto_em(posicao(12, 3), espaco).mapa_altura()

sendo que mapa é uma classe, e depois o mapa_poe_objecto_em é uma funçao dentro dessa classe, tal como o mapa_altura. é possivel executar assim uma funçao depois da outra? nao deveria dar só para fazer mapa().mapa_poe_objecto_em(..) e mapa().mapa_altura(), é possivel fazer isto de pôr um após o outro? é que na funçao que o meu prof forneceu a funçao faz um após o outro, o que retorna-me sempre um NonType error... a função do prof. faz basicamente isto:

Teste 22 - TAI mapa - Falhou!

mapa().mapa_poe_objecto_em(posicao(12, 3), espaco).mapa_altura() retornou:

erro de execucao

Resultado pretendido:

> 12

é possivel fazer isto ou será erro do programa do prof? :S é que se fizer em separado funciona, mas quando faço juntas não dá... Agradecia uma resposta o mais rapido possivel, Obrigado.

Link to comment
Share on other sites

Ao invocares mapa() tas criar uma nova instancia de mapa, se mapa_poe_objecto_em() for um metodo da instancia mapa e nao da classe ate aqui funciona sem problemas, e para a chamada de mapa_altura() funcionar e necerario que o mapa_poe_objecto_em() retorna um objecto que saiba

chamar mapa_altura().

Para ser um bocado mais pratico ve este exemplo:

class Foo(object):
   def does_foo(self):
       pass

class Bar(object):
   def does_bar(self)
       foo = Foo()
       # fazes alguma coisa
       return foo

# esta chamada e valida
Bar().does_bar().does_foo()

Espero ter ajudado.

Edited by thoga31
GeSHi
  • Vote 1

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Link to comment
Share on other sites

Surgiu-me outra dúvida no decorrer do trabalho, tenho o meu programa deste genero:

obj_em={}
mapa_dois=[0]
mapa_linha=[0]
mapa_coluna=[0]
class mapa:           
   def __init__(self):
       self.mapa=[]
       self.obj_em=obj_em
       self.mapa_dois=mapa_dois
       self.mapa_linha=mapa_linha
       self.mapa_coluna=mapa_coluna

   def mapa_poe_objecto_em(self,posicao,objecto):
       self.obj_em[(posicao.posicao_linha(),posicao.posicao_coluna())]=objecto
       self.mapa_linha[0]=posicao.posicao_linha()
       self.mapa_coluna[0]=posicao.posicao_coluna()
       return mapa()

   def mapa_objecto_em(self,posicao):
       if (posicao.posicao_linha(),posicao.posicao_coluna()) in self.obj_em:
           return self.obj_em[(posicao.posicao_linha(),posicao.posicao_coluna())]
       else:
           return desconhecido

basicamente o mapa_poe_objecto_em poe um dado objecto numa dada posicao. Agora imaginando que coloco o objecto A na posicao (2,2), para "guardar" esse objecto defini o nome "obj_em" como um dicionário fora da classe porque se a definisse na funcao __init__ como self.obj_em={}, sempre que iria pôr um novo objecto numa posicao diferente, por exemplo o objecto B na posicao (3,3), o dicionario obj_em voltava a ficar vazio, por causa da funcao _init_ e acabava com o dicionario apenas com o objecto B. Gostava de saber se há maneira de, usando apenas nomes definidos dentro da classe, de "actualizar" as funcoes em _init_, do genero, depois de por o objecto A na posicao (2,2), este fica guardado e se de seguida fizer para por o objecto B na (3,3), ficam os dois guardados (A e B). Eu criei os nomes fora da classe para isso, mas gostava de saber se há outra maneira para o fazer dentro da classe, por uma questão de estilo de programação, para ficar mais apresentável vá, que os profs são esquisitinhos x)

Não sei se expressei a minha dúvida correctamente, mas se puderem ajudar agradecia.

Obrigado 😉

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.