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.