Eu tenho aprendido Python seguindo alguns tutoriais de pygame .
Nele, encontrei o uso extensivo da palavra-chave self e, vindo de um background principalmente em Java, acho que continuo esquecendo de digitar self . Por exemplo, em vez de self.rect.centerx
digitar rect.centerx
, porque, para mim, rect já é uma variável de membro da classe.
O paralelo Java em que posso pensar para esta situação está tendo que prefixar todas as referências a variáveis-membro com isso .
Estou preso prefixando todas as variáveis de membro com self , ou existe uma maneira de declará-las que me permitiria evitar isso?
Mesmo que o que estou sugerindo não seja pitônico , ainda gostaria de saber se é possível.
Dei uma olhada nessas perguntas relacionadas ao SO, mas elas não respondem muito bem o que estou procurando:
m_
prefixo para todos os nomes de membros observados por alguns programadores de C ++ / Java? O uso deself.
ajuda na legibilidade de maneira semelhante. Além disso, você deve ler dirtsimple.org/2004/12/python-is-not-java.html .m_
seja usado apenas para membros de dados não públicos não estáticos (pelo menos em C ++).mVariableName
, para variáveis-membro, ao codificar em Java. Acho que o comentário do @ Anurag resume muito bem o que um desenvolvedor Java deve fazer ao aprender python.Respostas:
Python requer especificação própria. O resultado é que nunca há confusão sobre o que é membro e o que não é, mesmo sem a definição completa da classe visível. Isso leva a propriedades úteis, como: você não pode adicionar membros que ocultam acidentalmente os não membros e, portanto, quebram o código.
Um exemplo extremo: você pode escrever uma classe sem ter conhecimento de quais classes base ela pode ter e sempre saber se está acessando um membro ou não:
Esse é o código completo ! (some_function retorna o tipo usado como base.)
Outro, onde os métodos de uma classe são compostos dinamicamente:
Lembre-se de que ambos os exemplos são extremos e você não os verá todos os dias, nem estou sugerindo que você escreva frequentemente códigos como esse, mas eles mostram claramente aspectos de auto explicitamente exigidos.
fonte
self
.__shadow__ myFieldName
. Isso impediria sombreamento acidental também, não é?As respostas anteriores são basicamente variantes de "você não pode" ou "você não deveria". Embora eu concorde com o último sentimento, tecnicamente a pergunta ainda não foi respondida.
Além disso, existem razões legítimas pelas quais alguém pode querer fazer algo como a pergunta real. Uma coisa que eu encontro às vezes são longas equações matemáticas, nas quais o uso de nomes longos torna a equação irreconhecível. Aqui estão algumas maneiras de como você pode fazer isso em um exemplo fixo:
O terceiro exemplo - ou seja, usar
for k in self.__dict__ : exec(k+'= self.'+k)
é basicamente o que a pergunta está realmente pedindo, mas deixe-me esclarecer que geralmente não acho que seja uma boa ideia.Para obter mais informações e maneiras de percorrer variáveis de classe ou até funções, consulte as respostas e a discussão desta pergunta . Para uma discussão de outras maneiras de nomear dinamicamente variáveis e por que isso geralmente não é uma boa ideia, consulte esta postagem no blog .
ATUALIZAÇÃO: Parece não haver maneira de atualizar ou alterar dinamicamente os locais em uma função no Python3, portanto, o calc3 e variantes semelhantes não são mais possíveis. A única solução compatível com python3 que consigo pensar agora é usar
globals
:O que, novamente, seria uma prática terrível em geral.
fonte
locals
vez de usarexec
?locals().update(self.__dict__)
em python 2 e 3, mas não funcionou. No python3, mesmo o truque 'exec' não é mais uma opção. Por outro lado,globals().update(self.__dict__)
funciona, mas seria uma prática terrível em geral.Na verdade,
self
não é uma palavra-chave, é apenas o nome dado convencionalmente ao primeiro parâmetro dos métodos de instância no Python. E esse primeiro parâmetro não pode ser ignorado, pois é o único mecanismo que um método tem para saber em qual instância da sua classe está sendo chamada.fonte
Você pode usar o nome que quiser, por exemplo
ou mesmo
mas você está preso ao usar um nome para o escopo.
Eu não recomendo que você use algo diferente de si mesmo, a menos que tenha um motivo convincente, pois isso o tornaria estranho para os pythonistas experientes.
fonte
self
e você deve seguir a convenção. Isso tornará seu código mais fácil de entender para qualquer programador Python experiente que o veja. (Isso inclui você, daqui a seis meses, tentando descobrir o que o seu antigo programa faz!)def function(_, variable): _.variable = variable
def funcion(*args): args[0].variable = args[1]
sim, você sempre deve especificar
self
, porque explícito é melhor que implícito, de acordo com a filosofia python.Você também descobrirá que a maneira como você programa em python é muito diferente da maneira como você programa em java; portanto, o uso de
self
tende a diminuir porque você não projeta tudo dentro do objeto. Em vez disso, você faz um uso maior da função no nível do módulo, que pode ser melhor testada.a propósito. Eu odiava no começo, agora eu odeio o oposto. o mesmo para controle de fluxo acionado por recuo.
fonte
self
em nada. Então, qual é o sentido de tê-los na aula?O "self" é o espaço reservado convencional da instância atual do objeto de uma classe. É usado quando você deseja se referir à propriedade, ao campo ou ao método do objeto dentro de uma classe, como se estivesse se referindo a "ele próprio". Mas, para tornar mais curto, alguém no domínio de programação Python começou a usar "self", outros domínios usam "this", mas o fazem como uma palavra-chave que não pode ser substituída. Eu usei "its" para aumentar a legibilidade do código. É uma das coisas boas em Python - você tem a liberdade de escolher seu próprio espaço reservado para a instância do objeto que não seja "self". Exemplo para self:
Agora substituímos 'self' por 'its':
qual é mais legível agora?
fonte
s
(ou alguma outra letra única) em vez deits
s
tem o mesmo significado: um alias para a instância da classe. eu tenho que olhar para cima o queits
significa no contexto do mesmo jeitoself faz parte da sintaxe python para acessar membros de objetos, então, receio que você esteja preso a ela
fonte
Na verdade, você pode usar a receita "Eu implícito" da apresentação de Armin Ronacher "5 anos de más idéias" (pesquise no google).
É uma receita muito inteligente, como quase tudo, de Armin Ronacher, mas não acho que essa ideia seja muito atraente. Eu acho que prefiro isso explícito em C # / Java.
Atualizar. Link para "receita para más ideias": https://speakerdeck.com/mitsuhiko/5-years-of-bad-ideas?slide=58
fonte
def method(
<del> self </del>)
, masself.variable
ainda é necessário com este truque inteligente.Sim, o eu é tedioso. Mas é melhor?
fonte
_
tem um significado especial no shell Python, onde contém o último valor retornado. É seguro usá-lo assim, mas potencialmente confuso; Eu evitaria isso.s
, oum
(para imitar C ++)From: Self Hell - Funções mais stateful.
fonte
__str__
e similares), uma vez que esses métodos são invocados de maneira diferente dos métodos normais.Eu acho que seria mais fácil e mais legível se houvesse uma declaração "membro", assim como existe "global", para que você possa dizer ao intérprete quais são os objetos membros da classe.
fonte