Neste código:
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
... a self
variável representa a instância do próprio objeto. A maioria das linguagens orientadas a objetos passa isso como um parâmetro oculto para os métodos definidos em um objeto; Python não. Você tem que declarar explicitamente. Quando você cria uma instância da A
classe e chama seus métodos, ela é passada automaticamente, como em ...
a = A() # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument
O __init__
método é aproximadamente o que representa um construtor em Python. Quando você chama A()
Python, cria um objeto para você e o passa como o primeiro parâmetro para o __init__
método Quaisquer parâmetros adicionais (por exemplo, A(24, 'Hello')
) também serão passados como argumentos - nesse caso, causando uma exceção a ser levantada, pois o construtor não os espera.
x = 'Hello'
fora do init, mas dentro da classe? é como java onde é o mesmo ou se torna uma variável estática que é inicializada apenas uma vez?A.x
oua.x
. Note-se que substituindo-lo em uma classe específica não afetará a base, entãoA.x = 'foo'; a.x = 'bar'; print a.x; print A.x
irá imprimirbar
entãofoo
self
, é apenas por convenção.object
declaração de classe? Eu notei que algumas classes têm isso e outras nãoobject
porque isso acontece por padrão.Sim, você está certo, essas são construções oop.
__init__
é o construtor de uma classe. Oself
parâmetro refere-se à instância do objeto (comothis
em C ++).O
__init__
método é chamado quando a memória do objeto é alocada:É importante usar o
self
parâmetro dentro do método de um objeto se você quiser persistir o valor com o objeto. Se, por exemplo, você implementar o__init__
método como este:Seus parâmetros
x
ey
seriam armazenados em variáveis na pilha e descartados quando o método init fica fora do escopo. Definir essas variáveis comoself._x
eself._y
define essas variáveis como membros doPoint
objeto (acessível para a vida útil do objeto).fonte
self
de estar no construtor? Por que você precisa especificar, não seria melhor se estivesse implícito?Um breve exemplo ilustrativo
Na esperança de que possa ajudar um pouco, aqui está um exemplo simples que eu usei para entender a diferença entre uma variável declarada dentro de uma classe e uma variável declarada dentro de uma
__init__
função:Resultado:
fonte
__init__
é o que é passado para instâncias da classe, não a variável 'estática' da própria classe que tem o mesmo nome ...Em resumo:
self
como sugere, refere-se a si mesmo - o objeto que chamou o método. Ou seja, se você tiver N objetos chamando o método,self.a
se referirá a uma instância separada da variável para cada um dos N objetos. Imagine N cópias da variávela
para cada objeto__init__
é o que é chamado como construtor em outras linguagens OOP, como C ++ / Java. A idéia básica é que seja um método especial chamado automaticamente quando um objeto dessa classe é criadofonte
__init__
age como um construtor. Você precisará passar "self" para qualquer função de classe como o primeiro argumento, se desejar que eles se comportem como métodos não estáticos. "self" são variáveis de instância para sua classe.fonte
Experimente este código. Espero que ajude muitos programadores em C como eu a aprender Py.
Resultado:
Jay
Sum = 5
Doc - Inside Class
Doc - __init__ Constructor
Doc - Inside Show
Destructor Deleting object - Jay
fonte
Objetos de classe suportam dois tipos de operações: referências de atributo e instanciação
As referências de atributo usam a sintaxe padrão usada para todas as referências de atributo em Python: obj.name. Nomes de atributos válidos são todos os nomes que estavam no espaço de nomes da classe quando o objeto da classe foi criado. Portanto, se a definição de classe fosse assim:
em seguida,
MyClass.i
eMyClass.f
são referências a atributos válidos, retornando um número inteiro e um objeto de função, respectivamente. Os atributos de classe também podem ser atribuídos, para que você possa alterar o valorMyClass.i
por atribuição.__doc__
também é um atributo válido, retornando a docstring pertencente à classe: "A simple example class".A instanciação de classe usa notação de função. Apenas finja que o objeto de classe é uma função sem parâmetros que retorna uma nova instância da classe. Por exemplo:
A operação de instanciação ("chamando" um objeto de classe) cria um objeto vazio. Muitas classes gostam de criar objetos com instâncias personalizadas para um estado inicial específico. Portanto, uma classe pode definir um método especial chamado
__init__()
, assim:Quando uma classe define um
__init__()
método, a instanciação de classe invoca automaticamente a instância de classe__init__()
recém-criada. Portanto, neste exemplo, uma nova instância inicializada pode ser obtida por:Obviamente, o
__init__()
método pode ter argumentos para maior flexibilidade. Nesse caso, os argumentos fornecidos ao operador de instanciação de classe são transmitidos para__init__()
. Por exemplo,Retirado da documentação oficial que mais me ajudou no final.
Aqui está o meu exemplo
Quando você cria uma instância da classe Bill:
Você obtém:
fonte
Eu tive problemas para entender isso sozinho. Mesmo depois de ler as respostas aqui.
Para entender corretamente o
__init__
método, você precisa entender a si mesmo.O auto Parâmetro
Os argumentos aceitos pelo
__init__
método são:Mas nós apenas passamos dois argumentos:
De onde vem o argumento extra?
Quando acessamos os atributos de um objeto, fazemos por nome (ou por referência). Aqui, a instância é uma referência ao nosso novo objeto. Acessamos o método printargs do objeto de instância usando instance.printargs.
Para acessar os atributos do objeto de dentro do
__init__
método, precisamos de uma referência ao objeto.Sempre que um método é chamado, uma referência ao objeto principal é passada como o primeiro argumento. Por convenção, você sempre chama esse primeiro argumento aos seus métodos.
Isso significa que no
__init__
método que podemos fazer:Aqui estamos definindo atributos no objeto. Você pode verificar isso fazendo o seguinte:
valores como esse são conhecidos como atributos do objeto. Aqui, o
__init__
método define os atributos arg1 e arg2 da instância.fonte: http://www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method
fonte
observe que,
self
na verdade, pode ser qualquer identificador python válido. Por exemplo, poderíamos escrever com a mesma facilidade, a partir do exemplo de Chris B:e funcionaria exatamente da mesma maneira. No entanto, é recomendável usar self, porque outros pythoners o reconhecerão mais facilmente.
fonte
Basicamente, você precisa usar a palavra-chave 'self' ao usar uma variável em várias funções na mesma classe. Quanto ao init , é usado para configurar valores padrão, caso nenhuma outra função dessa classe seja chamada.
fonte
__init__
é basicamente uma função que "inicializa" / "ativa" as propriedades da classe para um objeto específico, uma vez criada e correspondida à classe correspondente.self
representa o objeto que herdará essas propriedades.fonte
O 'self' é uma referência à instância da classe
Agora podemos criar uma instância de foo e chamar o método, o parâmetro self é adicionado pelo Python neste caso:
Mas também pode ser passado se a chamada do método não estiver no contexto de uma instância da classe, o código abaixo faz a mesma coisa
Curiosamente, o nome da variável 'self' é apenas uma convenção. A definição abaixo funcionará exatamente da mesma maneira. Dito isto, é uma convenção muito forte que deve ser seguida sempre , mas diz algo sobre a natureza flexível da linguagem
fonte
s
) estava mostrando a flexibilidade do python.Apenas uma demonstração para a pergunta.
fonte
Neste código:
Aqui
__init__
atua como um construtor para a classe e quando um objeto é instanciado, essa função é chamada.self
representa o objeto instanciador.O resultado das instruções acima será o seguinte:
fonte
O primeiro argumento de todo método de classe, incluindo init, é sempre uma referência à instância atual da classe . Por convenção, esse argumento sempre é nomeado
self
. No método init,self
refere-se ao objeto recém-criado; em outros métodos de classe, refere-se à instância cujo método foi chamado.O Python não força você a usar o " self ". Você pode dar o nome que quiser. Mas lembre-se de que o primeiro argumento em uma definição de método é uma referência ao objeto . Python adiciona o
self
argumento à lista para você; você não precisa incluí-lo quando chama os métodos. se você não forneceu o método init no init, receberá um erroinit
é curto para inicialização. É um construtor que é chamado quando você cria uma instância da classe e não é necessário . Mas geralmente é nossa prática escrever o método init para definir o estado padrão do objeto. Se você não estiver disposto a definir nenhum estado do objeto inicialmente, não precisará escrever esse método.fonte
fonte
O exemplo dado não está correto, então deixe-me criar um exemplo correto com base nele:
Quando criamos uma instância do objeto, o
__init__
é chamado para personalizar o objeto depois que ele foi criado. Isto é, quando chamamosSomeObject
com'blah'
abaixo (que poderia ser qualquer coisa), ele é passado para a__init__
função como argumento,blah
:O
self
argumento é a instância doSomeObject
qual será atribuídoan_object
.Mais tarde, convém chamar um método neste objeto:
Fazer a pesquisa pontilhada, ou seja,
an_object.method
vincula a instância a uma instância da função, e o método (como chamado acima) agora é um método "vinculado" - o que significa que não precisamos passar explicitamente a instância para a chamada do método .A chamada de método obtém a instância porque estava vinculada à pesquisa pontilhada e, quando chamada, executa o código que foi programado para executar.
O
self
argumento implicitamente passado é chamadoself
por convenção. Poderíamos usar qualquer outro nome legal do Python, mas você provavelmente será prejudicado por outros programadores do Python se o mudar para outra coisa.__init__
é um método especial, documentado na documentação do modelo de dados Python . É chamado imediatamente após a criação da instância (geralmente via__new__
- embora__new__
não seja necessária, a menos que você esteja subclassificando um tipo de dados imutável).fonte
Aqui, o cara escreveu muito bem e simples: https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/
Leia o link acima como uma referência para isso:
fonte