Qual é o objetivo da self
palavra em Python? Entendo que se refere ao objeto específico criado a partir dessa classe, mas não consigo entender por que ele precisa ser explicitamente adicionado a todas as funções como parâmetro. Para ilustrar, no Ruby eu posso fazer isso:
class myClass
def myFunc(name)
@name = name
end
end
O que eu entendo facilmente. No entanto, em Python, preciso incluir self
:
class myClass:
def myFunc(self, name):
self.name = name
Alguém pode me falar sobre isso? Não é algo que me deparei na minha experiência (reconhecidamente limitada).
@name
mais intuitivo do queself.name
? O último, IMO, é mais intuitivo.@foo
eself.foo
são igualmente explícitos, pois nenhuma resolução implícita precisa ocorrer (por exemplo, em C ++, os membros da instância podem ser acessados "implicitamente" sem "explicitamente" usar espaços para nome). A única diferença é que o Ruby introduz uma nova semântica (@), enquanto o Python não. Se uma nova semântica valia ou não a quantidade de verbosidade evitada é puramente subjetiva. Porém, deve-se notar que a maioria das linguagens modernas escolhe introduzir um conceito aqui (por exemplo, $ php's $ this, JS's this).Respostas:
O motivo pelo qual você precisa usar
self.
é porque o Python não usa a@
sintaxe para se referir aos atributos da instância. O Python decidiu fazer métodos de uma maneira que faça com que a instância à qual o método pertence seja transmitida automaticamente, mas não recebida automaticamente: o primeiro parâmetro dos métodos é a instância na qual o método é chamado. Isso torna os métodos inteiramente iguais às funções e deixa o nome real para você (emboraself
seja a convenção, e as pessoas geralmente o encaram quando você usa outra coisa).self
Não é especial para o código, é apenas outro objeto .O Python poderia ter feito outra coisa para distinguir nomes normais de atributos - sintaxe especial como Ruby, ou exigindo declarações como C ++ e Java, ou talvez algo ainda mais diferente - mas não o fez. O Python é tudo para tornar as coisas explícitas, tornando óbvio o que é o quê e, embora não faça isso totalmente em todos os lugares, ele faz isso por exemplo, atributos. É por isso que atribuir a um atributo de instância precisa saber a qual instância atribuir e é por isso que ele precisa
self.
.fonte
cls
refere-se ao objecto de classe, não ocorrência de objetocls
eself
é usada convencionalmente, por exemplo, métodos. Se eu quisesse, poderia usar métodos deself
classe e,cls
por exemplo, métodos. Eu também poderia usarbob
efnord
se eu gostasse.this
em vez deself
. Temself
algum histórico que não conheço em linguagens de programação mais antigas?self
Veio das convenções do Modula-3, veja esta resposta para obter mais detalhes sobre essa escolha. (Isenção de responsabilidade: é minha).self
palavra-chave (Smalltalk, 1980) é anterior àthis
palavra - chave (do C ++). Veja: stackoverflow.com/questions/1079983/…Vamos dar uma classe vetorial simples:
Queremos ter um método que calcule o comprimento. Como seria se quiséssemos defini-lo dentro da classe?
Como deveria ser quando deveríamos defini-lo como um método / função global?
Portanto, toda a estrutura permanece a mesma. Como posso fazer uso disso? Se assumirmos por um momento que não escrevemos um
length
método para nossaVector
classe, poderíamos fazer o seguinte:Isso funciona porque o primeiro parâmetro de
length_global
, pode ser reutilizado como oself
parâmetro emlength_new
. Isso não seria possível sem um explícitoself
.Outra maneira de entender a necessidade do explícito
self
é ver onde o Python adiciona um pouco de açúcar sintático. Quando você se lembra, basicamente, uma ligação comoé transformado internamente para
é fácil ver onde eles
self
se encaixam. Na verdade, você não escreve métodos de instância no Python; o que você escreve são métodos de classe que devem ter uma instância como primeiro parâmetro. E, portanto, você precisará colocar o parâmetro de instância em algum lugar explicitamente.fonte
Vector.length_new = length_global
mostra o exemplo.Digamos que você tenha uma classe
ClassA
que contenha um métodomethodA
definido como:e
ObjectA
é uma instância desta classe.Agora, quando
ObjectA.methodA(arg1, arg2)
é chamado, o python o converte internamente para você como:A
self
variável refere-se ao próprio objeto.fonte
Quando os objetos são instanciados, o próprio objeto é passado para o próprio parâmetro.
Por esse motivo, os dados do objeto são vinculados ao objeto. Abaixo está um exemplo de como você pode visualizar a aparência dos dados de cada objeto. Observe como 'self' é substituído pelo nome do objeto. Não estou dizendo que este diagrama de exemplo abaixo seja totalmente preciso, mas espero que sirva a um propósito na visualização do uso do eu.
O Objeto é passado para o próprio parâmetro para que o objeto possa manter seus próprios dados.
Embora isso possa não ser totalmente preciso, pense no processo de instanciar um objeto como este: Quando um objeto é criado, ele usa a classe como modelo para seus próprios dados e métodos. Sem passar seu próprio nome para o parâmetro self, os atributos e métodos na classe permaneceriam como um modelo geral e não seriam referenciados (pertencerão a) ao objeto. Portanto, ao passar o nome do objeto para o parâmetro self, isso significa que, se 100 objetos forem instanciados a partir de uma classe, todos eles poderão acompanhar seus próprios dados e métodos.
Veja a ilustração abaixo:
fonte
Eu gosto deste exemplo:
fonte
self
mas também do tipo de variável. Tente fazer o primeiro exemplo com número inteiro simples em vez de lista. O resultado seria bem diferente.a.foo
no primeiro exemplo, e nãoA.foo
? Claramentefoo
pertence à classe ...a
eb
são ambos os rótulos (ou ponteiros) paraA()
(a classe).a.foo
referencia oA().foo
método de classe. No segundo exemplo, porém,a
torna-se uma referência a uma instância deA()
, assim comob
. Agora que são instâncias, em vez do próprio objeto de classe, o self permite que ofoo
método opere nas instâncias.Vou demonstrar com código que não usa classes :
As aulas são apenas uma maneira de evitar passar esse "estado" o tempo todo (e outras coisas interessantes, como inicialização, composição de classes, as metaclasses raramente necessárias e suporte a métodos personalizados para substituir os operadores).
Agora vamos demonstrar o código acima usando o mecanismo incorporado da classe python, para mostrar como é basicamente a mesma coisa.
[migrou minha resposta da pergunta fechada duplicada]
fonte
Os seguintes trechos são da documentação do Python sobre o self :
Para obter mais informações, consulte o tutorial de documentação do Python sobre classes .
fonte
Assim como todos os outros motivos já mencionados, ele facilita o acesso a métodos substituídos; você pode ligar
Class.some_method(inst)
.Um exemplo de onde é útil:
fonte
Seu uso é semelhante ao uso da
this
palavra-chave em Java, ou seja, para fornecer uma referência ao objeto atual.fonte
Python não é uma linguagem criada para programação orientada a objetos, diferente de Java ou C ++.
Ao chamar um método estático em Python, basta escrever um método com argumentos regulares dentro dele.
No entanto, um método de objeto, que exige que você faça uma variável, que é um Animal, nesse caso, precisa do argumento próprio
O método self também é usado para se referir a um campo variável dentro da classe.
Nesse caso, self está se referindo à variável animalName de toda a classe. LEMBRE-SE: Se você tiver uma variável dentro de um método, o self não funcionará. Essa variável é simplesmente existente apenas enquanto esse método está em execução. Para definir campos (as variáveis de toda a classe), é necessário defini-los FORA DOS métodos da classe.
Se você não entende uma única palavra do que estou dizendo, então Google "Programação Orientada a Objetos". Depois de entender isso, você nem precisará fazer essa pergunta :).
fonte
staticMethod()
eobjectMethod(self)
. Gostaria de acrescentar que, para invocar o primeiro, você diriaAnimal.staticMethod()
, enquantoobjectMethod()
precisa de uma instância:a = Animal(); a.objectMethod()
def getAnimalName
para não prejudicar a string que você está tentando retornar eself
se refere à instância da classe, e não a qualquer campo dentro dela.Está lá para seguir o zen do Python "explícito é melhor do que implícito". É realmente uma referência ao seu objeto de classe. Em Java e PHP, por exemplo, é chamado
this
.Se
user_type_name
é um campo no seu modelo, você o acessaself.user_type_name
.fonte
Primeiro de tudo, self é um nome convencional, você pode colocar qualquer outra coisa (sendo coerente) em seu lugar.
Refere-se ao objeto em si; portanto, quando você o está usando, declara que .name e .age são propriedades dos objetos Student (nota, não da classe Student) que você criará.
O código está aqui
fonte
self
é uma referência de objeto ao próprio objeto; portanto, eles são iguais. Os métodos Python não são chamados no contexto do próprio objeto.self
no Python pode ser usado para lidar com modelos de objetos personalizados ou algo assim.fonte
O uso do argumento, convencionalmente chamado,
self
não é tão difícil de entender, como é por que é necessário? Ou por que mencioná-lo explicitamente? Suponho que essa seja uma questão maior para a maioria dos usuários que a pesquisarem, ou, caso contrário, eles certamente terão a mesma pergunta à medida que avançarem no aprendizado de python. Eu os recomendo a ler estes dois blogs:1: Uso de auto explicado
Observe que não é uma palavra-chave.
2: Por que temos dessa maneira e por que não podemos eliminá-lo como argumento, como Java, e ter uma palavra-chave
Outra coisa que gostaria de acrescentar é que um
self
argumento opcional me permite declarar métodos estáticos dentro de uma classe, não escrevendoself
.Exemplos de código:
PS : Isso funciona apenas no Python 3.x.
Nas versões anteriores, é necessário adicionar explicitamente o
@staticmethod
decorador, caso contrário, oself
argumento é obrigatório.fonte
Estou surpreso que ninguém tenha criado Lua. Lua também usa a variável 'self', no entanto, pode ser omitida, mas ainda usada. C ++ faz o mesmo com 'this'. Não vejo nenhuma razão para declarar 'self' em cada função, mas você ainda deve poder usá-lo da mesma forma que pode com lua e C ++. Para uma linguagem que se orgulha de ser breve, é estranho que exija que você declare a variável auto.
fonte
Dê uma olhada no exemplo a seguir, que explica claramente o objetivo de
self
self
é usado / necessário para distinguir entre instâncias.Fonte: variável auto explicada em python - Pythontips
fonte
É porque, pela maneira como o python é projetado, as alternativas dificilmente funcionariam. O Python é projetado para permitir que métodos ou funções sejam definidos em um contexto em que implícitos
this
(a-la Java / C ++) ou explícitos@
(a-la ruby) não funcionariam. Vamos dar um exemplo com a abordagem explícita com convenções python:Agora, a
fubar
função não funcionaria, pois assumiria queself
é uma variável global (efrob
também). A alternativa seria executar métodos com um escopo global substituído (ondeself
está o objeto).A abordagem implícita seria
Isso significaria que
myX
seria interpretado como uma variável local emfubar
(efrob
também). A alternativa aqui seria executar métodos com um escopo local substituído, que é retido entre as chamadas, mas isso removeria a possibilidade de variáveis locais do método.No entanto, a situação atual funciona bem:
aqui, quando chamado como método
frob
, receberá o objeto no qual é chamado viaself
parâmetro efubar
ainda pode ser chamado com um objeto como parâmetro e funcionará da mesma forma ( é o mesmo queC.frob
eu acho).fonte
No
__init__
método, self refere-se ao objeto recém-criado; em outros métodos de classe, refere-se à instância cujo método foi chamado.self, como nome, é apenas uma convenção , chame como quiser! mas ao usá-lo, por exemplo, para excluir o objeto, você deve usar o mesmo nome:,
__del__(var)
ondevar
foi usado no__init__(var,[...])
Você deve dar uma olhada
cls
também, para ter uma visão maior . Esta publicação pode ser útil.fonte
self está agindo como o nome do objeto atual ou a instância da classe.
fonte
self
é inevitável.Havia apenas uma pergunta que deveria
self
estar implícita ou explícita.Guido van Rossum
resolveu esta pergunta dizendo queself
tem que ficar .Então, onde
self
mora?Se nos atermos à programação funcional, não precisaríamos
self
. Uma vez que entramos no Python OOP , encontramosself
lá.Aqui está o caso de uso típico
class C
com o métodom1
Este programa produzirá:
Portanto,
self
mantém o endereço de memória da instância da classe. O objetivo deself
manter a referência, por exemplo, métodos e ter acesso explícito a essa referência.Observe que existem três tipos diferentes de métodos de classe:
fonte
dos documentos ,
precedendo esse trecho relacionado,
x = MyClass()
fonte
é uma referência explícita ao objeto de instância de classe.
fonte