Ao definir um método em uma classe em Python, ele se parece com isso:
class MyClass(object):
def __init__(self, x, y):
self.x = x
self.y = y
Mas em alguns outros idiomas, como o C #, você tem uma referência ao objeto ao qual o método está associado à palavra-chave "this" sem declará-lo como argumento no protótipo do método.
Esta foi uma decisão intencional de design de linguagem em Python ou existem alguns detalhes de implementação que exigem a aprovação de "self" como argumento?
self
para acessar membros. - stackoverflow.com/questions/910020/…Respostas:
Eu gosto de citar o Zen de Python de Peters. "Explícito é melhor que implícito."
Em Java e C ++, '
this.
' pode ser deduzido, exceto quando você tiver nomes de variáveis que impossibilitem a dedução. Então você às vezes precisa e às vezes não.O Python decide tornar coisas assim explícitas, e não baseadas em uma regra.
Além disso, como nada é implícito ou assumido, partes da implementação são expostas.
self.__class__
,self.__dict__
E outras estruturas "internos" estão disponíveis de uma forma óbvia.fonte
É para minimizar a diferença entre métodos e funções. Permite gerar métodos facilmente em metaclasses ou adicionar métodos em tempo de execução a classes pré-existentes.
por exemplo
Também (até onde eu sei) facilita a implementação do tempo de execução do python.
fonte
self
na declaração da função (lembre-se, talvez isso esteja atirando pedras de uma casa de vidro, pois o JavaScript tem algumasthis
semânticas de ligação bastante complicadas )Eu sugiro que se deva ler o blog de Guido van Rossum sobre este tópico - Por que o eu explícito tem que ficar .
fonte
O Python não força você a usar o "self". Você pode dar o nome que quiser. Você apenas precisa lembrar que o primeiro argumento em um cabeçalho de definição de método é uma referência ao objeto.
fonte
@staticmethod
ele não é.Também permite que você faça o seguinte: (em resumo, chamar
Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
retornará 12, mas o fará da maneira mais louca possível.Obviamente, isso é mais difícil de imaginar em linguagens como Java e C #. Ao tornar explícita a auto-referência, você pode se referir a qualquer objeto por essa auto-referência. Além disso, essa maneira de brincar com as classes em tempo de execução é mais difícil nas linguagens mais estáticas - não é necessariamente boa ou ruim. Só que o eu explícito permite que toda essa loucura exista.
Além disso, imagine o seguinte: gostaríamos de personalizar o comportamento dos métodos (para criação de perfil ou alguma magia negra louca). Isso pode nos levar a pensar: e se tivéssemos uma classe
Method
cujo comportamento poderíamos substituir ou controlar?Bem, aqui está:
E agora:
InnocentClass().magic_method()
agirá como esperado. O método será vinculado aoinnocent_self
parâmetro toInnocentClass
emagic_self
à instância MagicMethod. Estranho né? É como ter duas palavrasthis1
- chave ethis2
em linguagens como Java e C #. Magias como essa permitem que estruturas façam coisas que seriam muito mais detalhadas.Novamente, não quero comentar sobre a ética dessas coisas. Eu só queria mostrar coisas que seriam mais difíceis de fazer sem uma auto-referência explícita.
fonte
OuterClass.this
para obter o 'eu' da classe externa, mas você ainda pode usarthis
como referência a si mesma; muito parecido com o que você faz aqui em Python. Para mim, não foi mais difícil imaginar isso. Talvez isso dependa da proficiência de alguém no idioma em questão?Something
, que por sua vez é definida dentro de outra implementação anônimaSomething
? Em python, é claro, você pode se referir a qualquer um dos escopos.this
. Referências implícitas são impossíveis em Java.this
resultado. Por exemploObject self1 = this;
(use Object ou algo menos genérico). Então, se você tem acesso à variável nos âmbitos superiores, você poderia ter acesso aself1
,self2
...selfn
. Eu acho que estes devem ser declarados finais ou algo assim, mas pode funcionar.Eu acho que a verdadeira razão além de "O Zen do Python" é que as funções são cidadãos de primeira classe em Python.
O que essencialmente os torna um objeto. Agora, a questão fundamental é se suas funções também são objetos, no paradigma orientado a objetos, como você enviaria mensagens para objetos quando as próprias mensagens fossem objetos?
Parece um problema de ovo de galinha. Para reduzir esse paradoxo, a única maneira possível é passar um contexto de execução para métodos ou detectá-lo. Mas como o python pode ter funções aninhadas, seria impossível fazê-lo, pois o contexto de execução mudaria para funções internas.
Isso significa que a única solução possível é passar explicitamente 'self' (o contexto de execução).
Então eu acredito que é um problema de implementação que o Zen veio muito mais tarde.
fonte
Eu acho que tem a ver com PEP 227:
fonte
Conforme explicado em si mesmo em Python, Desmistificado
Invocações:
init () define três parâmetros, mas passamos dois (6 e 8). Da mesma forma, distance () requer um, mas nenhum argumento foi passado.
Por que o Python não está reclamando dessa incompatibilidade de número de argumento ?
fonte
Há também outra resposta muito simples: de acordo com o zen do python , "explícito é melhor que implícito".
fonte