Mudança de Comportamento interno usando Magia Métodos
a Magia métodos são métodos especiais que você pode definir para adicionar ‘magic’ para as suas aulas. Eles estão sempre cercados por duplos underscores, por exemplo, os métodos mágicos ___ init_ e __str__. Os métodos mágicos podem enriquecer o nosso design de classe dando-nos acesso às funcionalidades de sintaxe embutidas pelo Python.
Python permite que as nossas classes herdem das classes incorporadas. Uma classe de filhos herdeiros de um built-in compartilha todos os mesmos atributos, incluindo métodos como o built-in. Podemos tirar proveito da funcionalidade de núcleo embutido, mas personalizar operações selecionadas através do uso de métodos mágicos.
neste tutorial, vou ligar estas duas ideias para mostrar como podemos herdar a partir da classe built-in list e fazer uso de métodos mágicos em nosso design de classe. Vou modificar os três métodos mágicos que controlam a indexação da lista. Ao combinar estas duas características, Uma classe que é muito simples de USAR Pode ser construída e podemos adicionar comportamento aos métodos que desejamos. O comportamento embutido é familiar a todos os desenvolvedores Python; por sua vez, isso faz uso de nossa classe herdeira fácil de aprender.finalmente, dois outros exemplos mais amplos ilustrando como métodos mágicos podem ser usados em operações de transmissão e mudando o estado de uma instância serão demonstrados. Todo o código de acompanhamento está disponível através do GitHub.exemplo 1: A indexação de listas
os métodos mágicos podem ser manipulados para modificar a indexação de listas. A classe MyCustomList, herda do tipo de lista embutida. Isto significa que qualquer objeto que é criado através da classe MyCustomList se comportará como uma lista, exceto nos lugares onde escolhemos personalizar seletivamente métodos.
getitem, setitem e delitem são métodos mágicos que são invocados quando acessamos o índice da lista. O comportamento destes métodos mágicos pode ser modificado.
no exemplo mostrado abaixo, estamos descartando a ideia de indexação de listas começando no índice zeroth. Se o usuário tentar acessar um elemento de nossa lista usando o índice zeroth, uma exceção de erro de valor será levantada e o programa terminará. Se o usuário entrar em um índice de Lista maior que um, os métodos irão reduzir o índice por um, e então chamar a lista de classe pai com o índice.
para mostrar como estes métodos definidos na classe MyCustomList são usados, veja abaixo na linha de comandos interativa Python.
O exemplo mostra como getitem setitem e delitem pode ser chamado. Métodos mágicos podem ser chamados implicitamente. Para __ _ getitem__, para acessar o primeiro índice, basta escrever o nome do objeto seguido pela posição do Índice entre parênteses rectos.
O mais interessante, é que quando pedimos o elemento na posição de índice 1, o valor inteiro 1 é retornado, mesmo que 1 seja o elemento zeroth. O que temos aqui é uma lista que começa a indexar a partir da 1. Na verdade, está a compensar a confusão que todos tivemos quando aprendemos a indexar listas.
Agora, vamos mudar o valor inteiro 1 na lista para 100. Para fazer isso, precisamos invocar setitem. Para fazer isso, nós simplesmente escrevemos o nome do objeto, seguido por parênteses rectos e uma atribuição. Mais uma vez, para alterar o primeiro elemento da lista usamos a posição de índice 1. Quando saímos a lista novamente, podemos ver claramente que o primeiro elemento mudou de 1 para 100.
finalmente, para excluir um elemento da lista _ _ _ delitar__ pode ser definido. O método de__ _ delitem _ _ magic é invocado,quando usamos a palavra-chave del python que se resolve para a chamada do método ___ delitem__. Para continuar a construir em nosso exemplo de indexação de lista, vamos apagar o primeiro elemento do índice, o valor inteiro 100. Quando chamamos del, seguido pelo objeto e a posição de índice do elemento que queremos excluir, neste exemplo, o primeiro elemento da lista 100, podemos agora ver que 100 foi de fato removido!
os métodos mágicos oferecem a chance de modificar o comportamento padrão. O melhor de tudo, não há necessidade de aprender novos nomes de métodos ou uma nova interface, para que os métodos possam ser intuitivamente implementados. Um guia para usar estes métodos mágicos implementados no MyCustomList é especificado na tabela abaixo.
Example 2: O método mágico
também podemos fazer uso do operador de multiplicação no nosso design de classe. Uma vez que nós herdamos da classe built-in list, nós podemos zip dois objetos MyCustomList juntos (porque eles agem como objetos da lista) e iterate através do objeto zip. Durante as iterações, podemos multiplicar os elementos em cada lista pelo seu elemento correspondente na outra lista de uma forma de transmissão (ver __mul__ _ Magic method code snippet abaixo). Este comportamento de transmissão é semelhante ao encontrado em pacotes de análise de dados como Pandas e Numpy.
O exemplo mostra que podemos múltiplos dois objetos MyCustomList juntos usando o sinal*. Se capturarmos o valor devolvido em uma variável chamada list_three, e imprimir list_three, uma nova lista é saída. Esta lista é o produto da multiplicação dos elementos uns contra os outros a partir das outras 2 listas.
todo O código fonte para a classe usada neste exemplo, MyCustomList é mostrado abaixo:
Exemplo de Bônus: O _ _ _ call_ _ método mágico
para terminar, vou ilustrar como o _ _ call_ _ método mágico em Python pode ser invocado. __call__
pode ser particularmente útil em classes com instâncias que precisam muitas vezes mudar seu estado. “Chamar” a instância pode ser uma forma intuitiva e elegante de mudar o estado do objeto.
considere o exemplo mostrado. Aqui, A classe MyClass tem um construtor init que espera três argumentos passados. Estes três argumentos podem ser passados na assinatura do método init e atribuídos como atributos no objeto.
o método call magic é útil quando queremos mudar o estado de uma instância, sem realmente criar uma nova instância.
Quando a instância é inicializada pela primeira vez, eu passo nos inteiros 1, 2 e 3, que são atribuídos como atributos var_1, var_2, e var_3 na instância, respectivamente. Quando eu uso a instrução print para mostrar a saída da instância, obj, usando o __dict__ atributo, eu posso ver que var_1 é atribuído o valor 1, var_2 é atribuído o valor 2, e var_3 é atribuído o valor 3.
Agora, vamos propor que eu gostaria de alterar os valores dos atributos var_1 e var_2 desta instância, mantendo o atributo var_3 como era quando a instância foi originalmente construída.
para fazer isso é simples. Eu defino um método de magia de chamadas, que permite que os atributos var_1 e var_2 sejam redefinidos. Métodos mágicos podem ser chamados implicitamente, o que significa que eu simplesmente chamo obj(200, 300), e o método de chamada será invocado. É claro que também é possível invocar o método de chamada explicitamente, por exemplo, obj.__ chamar__ _ (200, 300), mas o primeiro método parece mais intuitivo. Finalmente, para fins de demonstração, imprimi a identificação da instância para mostrar definitivamente, que manipulamos o mesmo objeto.
O método de chamada pode ser definido de duas maneiras. Os argumentos podem ser transferidos diretamente para a assinatura do método de chamada. Alternativamente, o argumento * vars pode ser usado, que captura todos os argumentos passados e os armazena em uma tupla, que pode ser desempacotado como mostrado acima.
O código fonte deste exemplo pode ser encontrado abaixo.
Resumo
a Magia métodos podem enriquecer a nossa concepção de classe, dando-nos acesso ao núcleo de recursos de sintaxe. Nos primeiros exemplos, temos o melhor de ambos os mundos. Nós podemos herdar da classe built-in list, e modificar métodos particulares nessa classe para personalizar o comportamento. getitem, setitem e delitem foram todos modificados, mas através da herança, ainda fomos capazes de fazer uso dos métodos incorporados da lista init e repr (), por exemplo.
podemos comunicar o uso dos objetos de forma extremamente fácil para outros desenvolvedores. No exemplo fornecido, tudo o que precisamos dizer aos nossos colegas desenvolvedores é que nossa classe age como uma lista, apenas um pouco diferente, aqui descartamos a idéia de um índice zeroth. Não há necessidade de aprender o nome de novos métodos ou uma nova interface.
além disso, o método de magia de chamada foi demonstrado. Chamar a instância pode ser uma forma intuitiva e elegante de mudar o estado do objeto.