Estou tendo problemas para entender a inicialização de classes.
Qual é o objetivo deles e como sabemos o que incluir neles? A escrita em sala de aula exige um tipo diferente de pensamento em relação à criação de funções (imaginei que poderia criar funções e depois envolvê-las em uma classe para poder reutilizá-las. Isso funcionará?)
Aqui está um exemplo:
class crawler:
# Initialize the crawler with the name of database
def __init__(self,dbname):
self.con=sqlite.connect(dbname)
def __del__(self):
self.con.close()
def dbcommit(self):
self.con.commit()
Ou outro exemplo de código:
class bicluster:
def __init__(self,vec,left=None,right=None,distance=0.0,id=None):
self.left=left
self.right=right
self.vec=vec
self.id=id
self.distance=distance
Existem tantas classes com que __init__
me deparo ao tentar ler o código de outras pessoas, mas não entendo a lógica de criá-las.
Respostas:
Pelo que você escreveu, você está perdendo uma parte crítica do entendimento: a diferença entre uma classe e um objeto.
__init__
não inicializa uma classe, inicializa uma instância de uma classe ou um objeto. Cada cão tem cor, mas os cães como classe não. Cada cão tem quatro ou menos pés, mas a classe de cães não. A classe é um conceito de um objeto. Quando você vê o Fido e o Spot, reconhece a semelhança entre eles e sua dogmática. Essa é a aula.Quando voce diz
Você está dizendo, Fido é um cachorro marrom com 4 pernas, enquanto Spot é um pouco aleijado e é principalmente amarelo. A
__init__
função é chamada de construtor ou inicializador e é chamada automaticamente quando você cria uma nova instância de uma classe. Dentro dessa função, o objeto recém-criado é atribuído ao parâmetroself
. A notaçãoself.legs
é um atributo chamadalegs
do objecto na variávelself
. Os atributos são variáveis semelhantes, mas descrevem o estado de um objeto ou ações (funções) específicas disponíveis para o objeto.No entanto, observe que você não
colour
escolhe a doghood - é um conceito abstrato. Existem atributos que fazem sentido nas classes. Por exemplo,population_size
é um desses - não faz sentido contar o Fido porque o Fido é sempre um. Faz sentido contar cães. Digamos que existem 200 milhões de cães no mundo. É propriedade da classe Dog. Fido não tem nada a ver com o número 200 milhões, nem o Spot. É chamado de "atributo de classe", em oposição a "atributos de instância" que sãocolour
oulegs
acima.Agora, para algo menos canino e mais relacionado à programação. Enquanto escrevo abaixo, a classe para adicionar coisas não é sensata - do que é uma classe? As classes em Python compõem coleções de dados diferentes, que se comportam de maneira semelhante. A classe de cães consiste em Fido e Spot e 199999999998 outros animais semelhantes a eles, todos mijando em postes de luz. Em que consiste a classe para adicionar coisas? Por quais dados inerentes a eles eles diferem? E que ações eles compartilham?
No entanto, números ... esses são assuntos mais interessantes. Diga, Inteiros. Há muitos deles, muito mais que cães. Eu sei que o Python já tem números inteiros, mas vamos nos fazer de bobo e "implementá-los" novamente (trapaceando e usando os números inteiros do Python).
Então, Inteiros são uma classe. Eles têm alguns dados (valor) e alguns comportamentos ("adicione-me a esse outro número"). Vamos mostrar isso:
Isso é um pouco frágil (estamos assumindo
other
que será um MyInteger), mas ignoraremos agora. No código real, nós não; nós o testávamos para ter certeza, e talvez até o coagia ("você não é um número inteiro? por golly, você tem 10 nanossegundos para se tornar um! 9 ... 8 ....")Poderíamos até definir frações. As frações também sabem como se adicionar.
Há ainda mais frações do que números inteiros (na verdade não, mas os computadores não sabem disso). Vamos fazer dois:
Você não está realmente declarando nada aqui. Os atributos são como um novo tipo de variável. Variáveis normais possuem apenas um valor. Digamos que você escreva
colour = "grey"
. Você não pode ter outra variável com o nomecolour
que está"fuchsia"
- não está no mesmo lugar no código.Matrizes resolvem isso até certo ponto. Se você disser
colour = ["grey", "fuchsia"]
, você empilhou duas cores na variável, mas as distingue pela posição (0 ou 1, neste caso).Atributos são variáveis vinculadas a um objeto. Assim como as matrizes, podemos ter muitas
colour
variáveis em cães diferentes . Então,fido.colour
é uma variável, masspot.colour
é outra. O primeiro está vinculado ao objeto dentro da variávelfido
; o segundospot
. Agora, quando você chamaDog(4, "brown")
, outhree.add(five)
, sempre haverá um parâmetro invisível, que será atribuído ao extra pendente na frente da lista de parâmetros. É chamado convencionalmenteself
e obterá o valor do objeto na frente do ponto. Assim, dentro do cão__init__
(construtor),self
será o que o novo cão se tornará; dentroMyInteger
'sadd
,self
irá ser ligado ao objecto na variávelthree
. Portanto,three.value
será a mesma variável fora doadd
, comoself.value
dentro doadd
.Se eu disser
the_mangy_one = fido
, começarei a me referir ao objeto conhecido comofido
com outro nome. A partir de agora,fido.colour
é exatamente a mesma variável quethe_mangy_one.colour
.Então, as coisas dentro do
__init__
. Você pode pensar nelas como anotando coisas na certidão de nascimento do cão.colour
por si só é uma variável aleatória, pode conter qualquer coisa.fido.colour
ouself.colour
é como um campo de formulário na folha de identidade do cão; e__init__
é o funcionário preenchendo-o pela primeira vez.Mais claro?
EDIT : Expandindo no comentário abaixo:
Você quer dizer uma lista de objetos , não é?
Primeiro de tudo,
fido
na verdade não é um objeto. É uma variável que atualmente contém um objeto, assim como quando você dizx = 5
,x
é uma variável que atualmente contém o número cinco. Se você mudar de idéia mais tarde, poderá fazê-lofido = Cat(4, "pleasing")
(desde que tenha criado uma classeCat
) efido
, a partir de então, "conterá" um objeto gato. Se o fizerfido = x
, ele conterá o número cinco, e não um objeto animal.Uma classe por si só não conhece suas instâncias, a menos que você escreva um código especificamente para acompanhá-las. Por exemplo:
Aqui
census
está um atributo deCat
classe no nível de classe.Note que você não receberá
[fluffy, sparky]
. Esses são apenas nomes de variáveis. Se você deseja que os próprios gatos tenham nomes, é necessário criar um atributo separado para o nome e substituir o__str__
método para retornar esse nome. O objetivo deste método (isto é, função vinculada à classe, exatamente comoadd
ou__init__
) é descrever como converter o objeto em uma string, como quando você o imprime.fonte
Contribuir com meus 5 centavos para a explicação completa de Amadan .
Onde classes são uma descrição "de um tipo" de maneira abstrata. Objetos são suas realizações: a coisa viva da respiração. No mundo orientado a objetos, existem idéias principais que você quase pode chamar de essência de tudo. Eles são:
Os objetos têm uma ou mais características (= atributos) e comportamentos (= métodos). O comportamento depende principalmente das características. As classes definem o que o comportamento deve realizar de uma maneira geral, mas enquanto a classe não for realizada (instanciada) como um objeto, ela permanecerá um conceito abstrato de uma possibilidade. Deixe-me ilustrar com a ajuda de "herança" e "polimorfismo".
Algumas características definem seres humanos. Mas toda nacionalidade difere um pouco. Então "tipos nacionais" são como seres humanos com extras. "Americanos" são um tipo de "Humanos" e herdam algumas características e comportamentos abstratos do tipo humano (classe base): isso é herança. Assim, todos os humanos podem rir e beber, portanto, todas as classes infantis também podem! Herança (2).
Mas como todos são do mesmo tipo (Tipo / classe base: Humanos), você pode trocá-los algumas vezes: veja o loop for no final. Mas eles vão expor uma característica individual, e isso é polimorfismo (3).
Portanto, cada ser humano tem uma bebida favorita, mas toda nacionalidade tende a um tipo especial de bebida. Se você subclassificar uma nacionalidade do tipo de Humanos, poderá sobrescrever o comportamento herdado, como demonstrei acima, com o
drink()
Método. Mas isso ainda é no nível de classe e, por isso, ainda é uma generalização.instancia a classe alemão e eu "mudei" uma característica padrão no início. (Mas se você chamar hans.drink ('Milk'), ele ainda imprimiria "Preciso de mais cerveja" - um bug óbvio ... ou talvez seja isso que eu chamaria de recurso, se eu fosse um funcionário de uma empresa maior. ;-)! )
A característica de um tipo, por exemplo, alemães (hans) é geralmente definida através do construtor (em python :)
__init__
no momento da instanciação. Este é o ponto em que você define uma classe para se tornar um objeto. Você pode dizer que respira a vida em um conceito abstrato (classe) preenchendo-a com características individuais e se tornando um objeto.Porém, como todo objeto é uma instância de uma classe, ele compartilha todos os tipos de características e comportamentos básicos. Essa é uma grande vantagem do conceito orientado a objetos.
Para proteger as características de cada objeto, você as encapsula - significa tentar combinar comportamento e característica e dificultar sua manipulação de fora do objeto. Isso é encapsulamento (1)
fonte
É apenas para inicializar as variáveis da instância.
Por exemplo, crie uma
crawler
instância com um nome de banco de dados específico (do seu exemplo acima).fonte
left=None
left será inicializado paraNone
se, na criação, oleft
parâmetro não for especificado.left = foo
funcionaria - uma vez. O objetivo das aulas é fazer algo sensato para todos os diferentescrawler
. Classes não são funções, nem algo que possa ser comparado a funções (bem, não até você estar muito mais avançado e entrar em programação funcional, mas isso só vai confundir você agora). Leia minha resposta para saber o que realmente são as aulas - você ainda não está entendendo.Parece que você precisa usar
__init__
no Python se deseja inicializar corretamente atributos mutáveis de suas instâncias.Veja o seguinte exemplo:
Isso é bem diferente em Java, onde cada atributo é inicializado automaticamente com um novo valor:
produz uma saída que esperamos intuitivamente:
Mas se você declarar
attr
comostatic
, ele agirá como Python:fonte
Seguindo o seu exemplo de carro : quando você compra um carro, você simplesmente não compra um carro aleatório, ou seja, você escolhe a cor, a marca, o número de assentos, etc. E algumas coisas também são "inicializadas" sem você escolher para isso, como número de rodas ou número de registro.
Portanto, no
__init__
método, você define os atributos da instância que está criando. Então, se quisermos um carro Renault azul, para 2 pessoas, inicializaríamos ou ocorreria algoCar
como:Dessa forma, estamos criando uma instância do
Car
classe. A__init__
é a que está a lidar com os atributos específicos (comocolor
oubrand
) e o seu gerando os outros atributos, comoregistration_number
.__init__
métodofonte
Classes são objetos com atributos (estado, característica) e métodos (funções, capacidades) específicos para esse objeto (como a cor branca e os poderes de voar, respectivamente, para um pato).
Ao criar uma instância de uma classe, você pode dar a ela alguma personalidade inicial (estado ou personagem, como o nome e a cor do vestido dela para um recém-nascido). Você faz isso com
__init__
.__init__
Define basicamente as características da instância automaticamente quando você chamainstance = MyClass(some_individual_traits)
.fonte
A
__init__
função está configurando todas as variáveis de membro na classe. Assim que o seu bicluster for criado, você poderá acessar o membro e obter um valor de volta:Confira o Python Docs para obter mais informações. Você vai querer pegar um livro sobre os conceitos de OO para continuar aprendendo.
fonte
No exemplo acima, usamos as espécies como globais, uma vez que será sempre a mesma (tipo de constante que você pode dizer). quando você chamar o
__init__
método, todas as variáveis dentro__init__
dela serão iniciadas (por exemplo: raça, nome).se você imprimir o exemplo acima, chamando abaixo assim
Isso significa que ele será inicializado apenas durante a criação do objeto. qualquer coisa que você queira declarar constante a torne global e qualquer coisa que mude use
__init__
fonte