Atributos e Métodos públicos e privados

60 views
Skip to first unread message

Dioni Alves de Oliveira

unread,
Sep 19, 2017, 8:16:55 PM9/19/17
to Python Brasil
Boa noite,

Alguem poderia me dar um "Norte" sobre esse assunto? Ainda não consegui compreender plenamente sobre atributos e métodos públicos e privados, principalmente como utiliza-los em python.

Att
Dioni Alves

Paul Eipper

unread,
Sep 19, 2017, 11:17:34 PM9/19/17
to python-brasil
Qual a dúvida que tens exatamente? Caso esteja aprendendo sobre os conceitos, Python talvez não vai te dar a visão mais completa sobre o assunto.

Isso porque em Python a linguagem não força restrições de acesso, e o modo de separar publico e privado é apenas uma convenção e entendimento entre adultos, o objetivo é permitir o desenvolvedor aplicar seu bom senso e permitir ele resolver o seu problema da forma que melhor entender.

Dito isso, exemplo uma classe com acesso público e privado em Python:

class Controlador:

    def __init__(self, titulo, conexao_banco):
        self._view = MenuView(title=titulo)
        self._db = conexao_banco

    def atualizar(self):
        items = self._db.query(Item).all()
        self._update_subviews(items)
        self._view.redraw()

    def _update_subviews(self, items):
        self._view.remove_subviews()
        for item in items:
            subview = ItemView(item.nome)
            self._view.add_subview(subview)

    @property
    def titulo(self):
        return self._view.title

    @titulo.setter
    def titulo(self, texto):
        self._view.title = titulo



Uso da classe:

controlador = Controlador("Lista Vazia", session)
janela.mostrar(controlador)
session.add(Item(nome="Primeiro Item"))
controlador.titulo = "Minha Lista"
controlador.atualizar()

O que você pode notar nesse exemplo é que eu tenho uma classe que define uma API pública:

 + Controlador
    + titulo (atributo)
    + atualizar (método)

E tem uma estrutura privada:

 - Controlador
    - _view (atributo)
    - _db (atributo)
    - _update_subview (método)

Nada impede de alguém acessar a estrutura privada, mas a convenção de ter o underline [ _ ] indica que não há garantias para chamadas externas, pois são pensadas para uso interno da classe.

Por exemplo, se eu acessar diretamente controlador._view e colocar subviews externas nela, na próxima chamada de controlador.atualizar() todas serão removidas, algo que pode ser indesejado, mas que como foi marcado como privada não deve ser uma surpresa pois não foram feitas garantias sobre essa API interna.

att,


--
Paul Eipper

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasil+unsubscribe@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Paul Eipper

unread,
Sep 19, 2017, 11:31:07 PM9/19/17
to python-brasil
Errata: na property titulo.setter o parametro texto deveria ser chamado titulo.


--
Paul Eipper

Willie

unread,
Sep 20, 2017, 6:49:29 AM9/20/17
to Python Brasil
Algo que pode ser usado é o "name mangling" para criar atributos "privados", que é você esconder o nome real da variável prefixando o nome da classe (https://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles)
Então o código abaixo gera um erro:

class Person:
    def __init__(self, name):
        self.__name = name
me = Person("john")
print(me.__name)

Gera:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute '__name'

Isso seria um comportamente equivalente a querer acessar uma variável privada de uma classe.
porque com dois underlines você só pode acessar o atributo colocando o nome da classe antes. No caso do codigo anterior teria de ser:

print( me._Person__name )

Mas o que seria equivalente à um atributo "protected" do C++/C#/Java eu não sei como poderia ser feito :(

Élysson Mendes Rezende

unread,
Sep 20, 2017, 9:16:40 AM9/20/17
to Python Brasil
Bom dia tudo bom?

Estava discutindo sobre isso com um colega de trabalho que veio de outra linguagem. Eu particularmente gosto da abordagem do Paul, acho que casa muito bem com manter o código simples além de permitir de forma bem eficiente de testar o código como um todo.
Tivemos aqui alguns problemas em mockar algumas coisas e testes unitários que não eram muito bem unitários heheheh

Abraço

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.
--
Élysson MR
elyssonmr.com
Talk/Email: elys...@gmail.com
Skype:       elyssonmr
Twitter:       @elyssonmr

Renzo Nuccitelli

unread,
Sep 20, 2017, 4:32:09 PM9/20/17
to Python Brasil

Tambem sou a favor da simplicidade. Mesmo na epoca do Java acabavamos por deixar os atributos default só oara podermos criar o pacote de teste com mesmo nome e poder fazer assert em todos atributos.

De toda forma é no curso puthon patterns que estou ministrando vinos semana passada um padrao restritor que impede o desenvolvedor de acessar qualquer atributo de um objeto iniciado com underline:

https://github.com/renzon/python-patterns/blob/master/wrap/restritor.py

Eu não usaria isso em projeto meu mas é bem interesante ver a elegância da solução ;)

Renzo Nuccitelli

Eu leio email somente uma vez por dia. Se o assunto for urgente, me ligue.


Reply all
Reply to author
Forward
0 new messages