Tutorial dos descritores de Python

Tutorial dos descritores de Python
Uma técnica útil para escrever código genérico que pode ser reutilizado entre as classes é suportado por descritores de Python, ou mais conhecido como descritores. Eles podem parecer próximos da noção de herança, mas não são. Esta é uma técnica direta para capturar acesso a atributos com uma natureza vinculativa. Os descritores são uma função básica do python que governa muitas das feitiçarias, escondidas sob a cobertura da linguagem. Se você já sentiu que os descritores do Python com poucas implementações funcionais são um assunto avançado, este tutorial é a plataforma final para fazer você entender esse recurso poderoso.

Métodos descritores

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

__pegar__(): Quando você tenta extrair os dados, o __pegar__() o atributo é chamado, e o que for fornecido é o que seria fornecido ao código que exige o valor de uma variável. É categorizado como um descritor não-data e é apenas legível.

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

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

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

__get __ (self, obj, tipo = nenhum) -> objeto
__set __ (self, obj, valor) -> nenhum

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

Exemplo:

Aqui definimos duas classes. No descritor de classe, definimos métodos descritores. No pegar() Método, o eu é a instância para o descritor 'val', terá um valor 'geeks' e o armazena. Em seguida, ele fará uma string com 'para' anexada entre o atributo fornecido. Descritor de classe (objeto):

def __get __ (self, obj, objtype):
voltar para".formato (self.Val, eu.val)

Então retornará o valor do método set (). Esta função verifica o valor, seja 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):
Se IsInstance (Val, STR):
auto.val = val
outro:
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”
impressão (g.val)

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

Geeksforgeeks

Propósito dos descritores

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

Casa da aula:

def __init __ (self, loc, área, preço):

Em seguida, você pode usar a função __str __ (), que pode retornar o resultado dos três atributos que você pode passar para a classe ao criar 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á alteração, exceto o sinal negativo, conforme mostrado na saída. Espere! Algo está aqui, não é isso? Como é que o preço de uma casa é negativo. O Python permite porque o Python é um ambiente de desenvolvimento versátil que especificamente não permite verificação de tipo.

Vamos inicializar uma declaração 'se' em __iniciar__() função para aumentar 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_() A 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 falharia. O Python fornece descritores especializados em ajudar a corrigir todas as preocupações acima. Agora, vamos começar a usar descritores no mesmo exemplo para entendê -lo bem.

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

O __pegar__() 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 'Home' e devolva o preço.

A função __definir__() tem um atributo instância que contém H1, e um valor a ser atribuído. A verificação é usada para confirmar o valor. Se o valor for um número inteiro, ele será impresso, caso contrário, o código com uma exceção de erro de tipo de tipo. Se o valor estiver abaixo de zero, a exceção de erro de valor será jogada no código.

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

A classe em casa permanece a mesma, embora a instância preço da classe descritor () é adicionada. No __iniciar_() função, adicione o atributo de preço ao preço da instância e ele chamará o __definir_() função.

Ao executar este código, ele lhe dará 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 é substituído na formação de uma nova instância, pois os descritores estão relacionados à classe e não à instância. Dê uma olhada abaixo:

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 que tipo de cenários de uso você pode adicioná -los passando por este tutorial.