• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

djthyrax

Dúvidas "básicas" comuns sobre linguagens em geral e/ou em particular

11 mensagens neste tópico

Abri este tópico porque às vezes acontece termos uma ideia errada do que acontece quando o nosso código é executado. Muitas vezes, estes erros são culpa do autodidatismo, uma vez que não havendo um guia, há coisas que não percebemos e cria-se grandes e importantes gaps.

Este foi o caso do Tharis hoje, teima que em Python existem métodos privados, quando eu e o Triton dizemos que não.

Aqui está o código que ele usou para "provar" a sua ideia:

>>> class abc:
...    def __init__(self):
...        triton_sucks=5
...        self.triton="Sucka"
>>> abc().triton_sucks
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: abc instance has no attribute 'triton_sucks'
>>> abc().triton
'Sucka'

Agora lanço o desafio a quem ler este tópico a dizer que erros vêem no raciocínio dele.

PS: Isto não é um tópico para envergonhar o Tharis nem nada do género, simplesmente ele teve o azar de eu me lembrar de criar um tópico destes quando ele meteu a pata na poça. Isto é pura e simplesmente para fazê-lo ver onde errou, assim como ensinar a quem não sabe alguma coisa. Como tal, quaisquer faltas de respeito/gozo que existam neste tópico serão apagadas sem qualquer aviso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, python tem métodos privados:

Qualquer função que comece por dois underscores (__) mas não acabe com dois underscores é privada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, python tem métodos privados:

Qualquer função que comece por dois underscores (__) mas não acabe com dois underscores é privada.

>>> class abc:
    __i = 1


>>> abc.__i

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    abc.__i
AttributeError: class abc has no attribute '__i'
>>> abc._abc__i
1

Not really that private. :( Either way, que erros vês no pensamento dele?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que ele fez não faz sentido por causa do conceito de scope de variáveis..

Esse workaround é algo que não se deve fazer e só existe no python por razões de debug djthyrax..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para dizer os erros que o "pensamento" dele pode ter, convinha saber qual é o pensamento dele.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse workaround é algo que não se deve fazer e só existe no python por razões de debug djthyrax..

Não. O dir é suposto mostrar todos os atributos do objecto, e se fizeres a um que tenhas declarado __i e a outro que tenhas declarado i, ele devolve-te ['__doc__', '_abc__i'] no caso do __i (se a class se chamar abc) e ['__doc__', 'i']. Se fores a ver, o __x é apenas um shortcut para _class__x, tanto que se tu tentares aceder a um atributo supostamente privado, ele diz-te que o atributo não existe, não que não lhe podes aceder. :(

O que ele fez não faz sentido por causa do conceito de scope de variáveis..

Exacto.

Para dizer os erros que o "pensamento" dele pode ter, convinha saber qual é o pensamento dele.

Ele dizia que para criar um atributo privado da class, bastava declará-lo no construtor/método qualquer da class. O que está incorrecto como o Warrior diz porque não consegues aceder porque declaras a variavel num scope diferente e não como atributo da instância da class, daí a necessidade da passagem do self, para podermos ter acesso à instancia da class.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Isso só suporta mais o que eu disse: no OOP de Python não existem métodos privados. Se olhares com atenção para a indentação, a única coisa que ele está a fazer é a definir uma função no scope do método __private__ da instância da class PrivateTest. É óbvio que não consigo aceder a algo desse scope a partir de outro diferente. Isso é apenas um workaround, e só prova que o private no Python está implementado mal e porcamente.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu nunca percebi a diferença entre

a = 1

_a = 1

__a = 1

__a__ = 1

No fundo é a mesma coisa, elas podem ser sempre acedidas, alguem em explica a diferença?

Agora lanço o desafio a quem ler este tópico a dizer que erros vêem no raciocínio dele.

Não faz sentido, a variavel está no escorpo da função, a função acaba a varia arde..., o self serve para adicionar/aceder a um objecto da class...
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não faz sentido, a variavel está no escorpo da função, a função acaba a varia arde..., o self serve para adicionar/aceder a um objecto da class...

Certo.

Eu nunca percebi a diferença entre

a = 1

_a = 1

__a = 1

__a__ = 1

No fundo é a mesma coisa, elas podem ser sempre acedidas, alguem em explica a diferença?

O uso das _ (seja _x, __x, __x__) é apenas "semântica". Salvo erro, por convenção, sem _ é um método público, com _ é um método público estático, com __ é um método privado, e o __ com __ no final não sei o nome ao certo, mas regra geral são métodos para serem chamados num determinado evento (podes ter uma ideia de quais num post que tenho na secção de tutoriais de Python que se cama Python Underscore Methods). Esta é a ideia que tenho, mas posso (é provavel que) estar enganado.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Este foi o caso do Tharis hoje, teima que em Python existem métodos privados, quando eu e o Triton dizemos que não.

>>> class abc:
...    def __init__(self):
...        triton_sucks=5
...        self.triton="Sucka"
>>> abc().triton_sucks
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: abc instance has no attribute 'triton_sucks'
>>> abc().triton
'Sucka'

"triton_sucks" vai ser uma variável local ao método, e como tal não vai ser visível de fora do construtor (e é garbage collected quando o contrutor acabar o "trabalho").

e o __ com __ no final não sei o nome ao certo, mas regra geral são métodos para serem chamados num determinado evento (podes ter uma ideia de quais num post que tenho na secção de tutoriais de Python que se cama Python Underscore Methods). Esta é a ideia que tenho, mas posso (é provavel que) estar enganado.

Os métodos com underscores no início e no final são usados para suportar operator overloading e derivados. (por exemplo, experiemnta fazer help(list) .... explica lá tudo).

JJ

0

Partilhar esta mensagem


Link 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