Ir para conteúdo
Fórum Script Brasil
  • 0

Getters e Setters


joao0212

Pergunta

Prezados,

Como informei no último post, estou aprendendo python há pouco tempo e tem surgido algumas dúvidas.

A dúvida da vez é referente ao encapsulamento.

Vamos ao exemplo:

Tenho 5 classes: Pessoa, Pai, Filha, Neta e TesteHerança

A classe pessoa contém atributos e métodos, porém vazios, pois ela só serve para ser herdada pelas outras (* No sentido em que todo pai, filha ... é uma pessoa)

# coding=utf-8

class Pessoa:
    nome = ''
    sobrenome = ''
    residencia = ''
    corDosOlhos = ''
    profissao = ''

    @classmethod
    def compararOlhos(cls):
        print ''

    @classmethod
    def imprimirInformacoes(cls):
        print ''

A classe Filha contém a sobrescrita dos atributos e do método imprimirInformacoes(), e contém uma informação que depende da Classe Pai:

# coding=utf-8

from Pessoa import Pessoa
from Pai import Pai

p = Pai()

class Filha(Pessoa):
    nome = 'Marina'
    sobrenome = 'Martins'
    corDosOlhos = 'Azuis'
    residencia = 'Planaltina'
    profissao = 'Professora'

    @classmethod
    def imprimirInformacoes(cls):
        print '%s %s' % (Filha.nome, Filha.sobrenome)
        print 'Os olhos são : ' + Filha.corDosOlhos
        print 'Reside ein: ' + Filha.residencia
        print 'Trabalha como: ' + Filha.profissao
        print 'O nome do pai é: ' + p.get_nome()

No momento em que eu dou p.get_nome() quero que ele receba o nome que vou passar no meu método set da Classe Pai.

 

eis que a classe Pai está assim e ela é justamente meu problema.

 

# coding=utf-8
from Pessoa import Pessoa

class Pai(Pessoa):
    nome = None
    sobrenome = 'Martins'
    corDosOlhos = 'Pretos'
    residencia = 'Lago norte'

    def get_nome(self):
        return self.nome

    def set_nome(self, nome):
        self.nome = nome

Preciso que o nome passado pelo usuário no argumento seja salvo no atributo nome, porém tentei de muitas formas e não consegui, fazendo com que minha classe Filha não consiga recuperar o nome do atributo pois o mesmo não está salvo. Quando informo nome = None, o programa diz que não pode concatenar o objetos NoneType com Str ... Quando informo nome = '' o programa mostra o campo vazio.

Não sei se deu pra entender, mas como eu posso fazer pro meu atributo salvar o nome que passo neste momento abaixo?

 

# coding=utf-8

from Pai import Pai
from Filha import Filha
from Neta import Neta


class Main:
    p = Pai()
    f = Filha()
    n = Neta()

    p.set_nome("Antonio")
    f.imprimirInformacoes()

Retorno quando declaro nome = ''

Marina Martins
Os olhos são : Azuis
Reside ein: Planaltina
Trabalha como: Professora
O nome do pai é: 

 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

O que acontece é que ao instanciar no seu exemplo...

# coding=utf-8

from Pai import Pai
from Filha import Filha
#from Neta import Neta


class Main:
    p = Pai()
    f = Filha()
    #n = Neta()

    p.set_nome("Antonio")
    f.imprimirInformacoes()

Esse "p" não é o mesmo que o objeto Pai instanciado dentro da classe Filha (apesar do mesmo nome, estão em escopos diferentes). Portanto, para fazer o que você quer, você deveria alterar a classe Filha para:

# coding=utf-8

from Pessoa import Pessoa
from Pai import Pai


class Filha(Pessoa):
    nome = 'Marina'
    sobrenome = 'Martins'
    corDosOlhos = 'Azuis'
    residencia = 'Planaltina'
    profissao = 'Professora'
    p = Pai()

    @classmethod
    def imprimirInformacoes(cls):
        print '%s %s' % (Filha.nome, Filha.sobrenome)
        print 'Os olhos são : ' + Filha.corDosOlhos
        print 'Reside ein: ' + Filha.residencia
        print 'Trabalha como: ' + Filha.profissao
        print 'O nome do pai é: ' + Filha.p.get_nome()

E trocar a seguinte linha do seu exemplo...

    p.set_nome("Antonio")

... por:

    f.p.set_nome("Antonio")

Note que neste caso o objeto Pai (p) é diferente do objeto Pai criado dentro da classe Filha (f.p). Ou seja, se você for checar o nome do objeto p e do objeto f.p, você terá resultados diferentes.

Essa acima é uma das possíveis soluções, sendo outra que imagino ser melhor seria passar o objeto Pai ao criar ao objeto Filha. Assim você teria o seu objeto Pai igual em ambas as instâncias. Para isso, você pode colocar a classe Filha com o seguinte código:

# coding=utf-8

from Pessoa import Pessoa
from Pai import Pai


class Filha(Pessoa):
    nome = 'Marina'
    sobrenome = 'Martins'
    corDosOlhos = 'Azuis'
    residencia = 'Planaltina'
    profissao = 'Professora'

    def __init__(self, objPai):
        Filha.p = objPai
        
    @classmethod
    def imprimirInformacoes(cls):
        print '%s %s' % (Filha.nome, Filha.sobrenome)
        print 'Os olhos são : ' + Filha.corDosOlhos
        print 'Reside ein: ' + Filha.residencia
        print 'Trabalha como: ' + Filha.profissao
        print 'O nome do pai é: ' + Filha.p.get_nome()

E o seu código de exemplo voltaria ao original:

# coding=utf-8

from Pai import Pai
from Filha import Filha
#from Neta import Neta


class Main:
    p = Pai()
    f = Filha(p)
    #n = Neta()

    p.set_nome("Antonio")

    print "f.p.nome == " + f.p.get_nome() 
    print "p.nome == " + p.get_nome()
    
    f.imprimirInformacoes()

Adicionei os 2 prints para confirmar que ambos tem os mesmos valores. Isso não seria possível com o exemplo anterior, já que tínhamos um "p" fora da classe e outro "p" dentro dela.

No caso, essa implementação depende do que foi pedido, mas o importante é saber que deve existir uma relação entre dois objetos para que um possa usar propriedades do outro. Ou um objeto instancia um objeto da outra classe (primeiro exemplo) ou faz referência ao mesmo (segundo exemplo).

Beleza?

Abraços!

 

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...