Pitão

Tutorial de descritores de Python

Tutorial de descritores de Python
Uma técnica útil para escrever código genérico que pode ser reutilizado entre as classes é suportada por descritores Python, ou mais comumente conhecidos como descritores. Eles podem soar próximos à noção de herança, mas eles não são. Esta é uma técnica direta para capturar o acesso a atributos com natureza vinculativa. Os descritores são uma função básica do Python que governa muito da feitiçaria, escondida sob a capa da linguagem. Se você já sentiu que os descritores Python com poucas implementações funcionais são um assunto avançado, então este tutorial é a plataforma definitiva para fazer você entender esse recurso poderoso.

Métodos Descritores

Para ser mais claro, uma classe que implementa __obter_(), __definir()_, ou __excluir()_ função de um protocolo descritor para um objeto é classificado como um "Descritor". Para governar os parâmetros de várias classes que usam o objeto como referência, os descritores Python são feitos. Aqui estão três métodos especificados, que serão usados ​​nos descritores:

__obter__(): Quando você tenta extrair os dados, o __obter__() atributo é chamado, e tudo o que ele fornece é o que seria fornecido ao código que exige o valor de uma variável. É categorizado como um descritor sem dados e é apenas legível.

__definir__(): A função __definir__() é chamado para ajustar os valores dos parâmetros e nada é retornado a você por esta função. É conhecido como um descritor de dados que não é apenas legível, mas também gravável.

__excluir__(): Sempre que o parâmetro é removido de um objeto, o __excluir__() função é chamada. É conhecido como um descritor de dados que não é apenas legível, mas também gravável.

Você só precisa impor o protocolo do descritor se estiver usando descritores Python em seu script. As funções mais significativas do protocolo são obter() e definir() tendo a assinatura subsequente.

__get __ (self, obj, type = None) -> objeto
__set __ (self, obj, value) -> Nenhum

auto é a instância do descritor.
obj é uma instância do objeto ao qual o seu descritor está conectado.
modelo é o tipo de um objeto.

Exemplo:

Aqui nós definimos duas classes. Na classe Descriptor, definimos métodos de descritor. No obter(), o self é a instância do descritor 'val', ele obterá um valor 'Geeks' e o armazenará. Em seguida, ele fará uma string com 'for' anexado entre o atributo fornecido. Descritor de classe (objeto):

def __get __ (self, obj, objtype):
voltar para".formato (próprio.val, self.val)

Em seguida, ele retornará o valor para o método set (). Esta função então verifica o valor, se é uma string ou não. Caso o valor seja uma string, ele será salvo em um atributo chamado 'val'. Se o valor não for uma string, ele lançará uma exceção.

def __set __ (self, obj, val):
if isinstance (val, str):
auto.val = val
senão:
raise TypeError (“Nome deve ser string”)

Depois disso, o valor será impresso como uma string 'GeeksforGeeks'.

classe GFG (objeto):
val = descritor ()
g = GFG ()
g.val = “Geeks”
imprimir (g.val)

Ao tentar executar este código, você obterá a seguinte saída:

GeeksforGeeks

Objetivo dos Descritores

Vamos descrever uma classe chamada 'casa' com três características, a saber: loc, área e preço. Você pode usar a função __iniciar__() para inicializar os atributos de classe.

casa da classe:

def __init __ (self, loc, area, price):

Então, você pode usar a função __str __ (), que pode retornar o resultado dos três atributos que você pode passar para a classe ao construir o item. A função __str __ () retornará a string.

Quando você executa este código, ele exibe a saída aparentemente correta.

Agora vamos tentar mudar o preço da casa para um valor negativo, como abaixo, e executar o código.

Não há nenhuma mudança, exceto para o sinal negativo, conforme mostrado na saída. Espere! Algo está errado aqui, não é?? Como é que o preço de uma casa é negativo. Python permite isso porque Python é um ambiente de desenvolvimento versátil que especificamente não permite a verificação de tipo.

Vamos inicializar uma instrução 'if' em __iniciar__() função para levantar uma exceção se o valor ou preço for menor que zero.

A partir de agora, você pode notar que ele tem um bom desempenho e, se o preço for menor que zero, o código gera um erro de valor.

Como podemos entender, o __iniciar_() função é um construtor e só é invocado uma vez quando você faz um objeto de classe. Portanto, mais tarde, a verificação de tipo personalizada falhará. Python fornece descritores especializados em ajudar a corrigir todas as questões acima. Agora, vamos começar a usar descritores no mesmo exemplo para entendê-lo bem.

A classe Descriptor ' __iniciar_() função tem uma variável local __price em 0. No início, um sublinhado duplo implica que o parâmetro é privado. É usado para diferenciar o parâmetro de preço da classe Descritor da classe doméstica.

O __obter__() método retornará o preço. A instância do atributo contém h1, que é uma instância do descritor. O proprietário do atributo refere-se ao nome da classe 'casa' e retorna o preço.

A função __definir__() tem um atributo instância que contém h1 e um valor a ser atribuído. Check é usado para confirmar o valor. Se o valor for um inteiro, ele será impresso, caso contrário, o código lançará uma exceção de erro de tipo. Se o valor estiver abaixo de zero, a exceção Value Error será lançada no código.

O __excluir__() função é executada quando o atributo do parâmetro é removido de um objeto.

A classe doméstica permanece a mesma, embora a instância preço da classe Descriptor () é adicionado. No __iniciar_() função, adicione o atributo de preço ao preço da instância, e ela chamará o __definir_() função.

Ao executar este código, você receberá um erro de valor porque o preço nunca pode ser zero.

Agora tente executar o código com um valor de string.

Ele lançará uma exceção de erro de tipo.

O valor da instância existente é sobrescrito na formação de uma nova instância, uma vez que os descritores estão relacionados à classe e não à instância. Dê uma olhada em:

O primeiro valor foi substituído pelo segundo.

Conclusão

Podemos entender por que os descritores do Python se tornaram um tópico tão fascinante e a que tipo de cenários de uso você pode adicioná-los ao percorrer este tutorial.

Os 10 melhores jogos para jogar no Ubuntu
A plataforma Windows tem sido uma das plataformas dominantes para jogos devido à grande porcentagem de jogos que estão sendo desenvolvidos hoje para o...
5 melhores jogos de arcade para Linux
Hoje em dia, os computadores são máquinas sérias usadas para jogos. Se você não pode obter a nova pontuação máxima, você saberá o que quero dizer. Nes...
Batalha por Wesnoth 1.13.6 Desenvolvimento lançado
Batalha por Wesnoth 1.13.6 lançado no mês passado, é o sexto lançamento de desenvolvimento no 1.13.série x e oferece uma série de melhorias, principal...