Coletânea Python do ZERO às Redes Neurais Artificiais

Fernando Feltrin · Capítulo 122 de 287

Páginas do PDF

Coletânea Python do ZERO às Redes Neurais Artificiais

Métodos de classe estáticos e dinâmicos

 

Outra aplicação muito usada, embora grande parte das vezes implícita ao

código, é a definição manual de um método de classe quanto a sua visibilidade dentro do escopo da classe. Já vimos parte disso em tópicos anteriores, onde aprendemos que dependendo da indentação do código é criada uma hierarquia, onde determinadas variáveis dentro de funções/métodos de classe podem ser acessíveis e instanciáveis entre funções ou não, dependendo onde a mesma está declarada.

Em certas aplicações, é possível definir esse status de forma manual, e por meio deste tipo de declaração manual é possível fixar o escopo onde o método de classe irá retornar algum dado ou valor.

Em resumo, você pode definir manualmente se você estará criando objetos que utilizam de tudo o que está no escopo da classe, ou se o mesmo terá suas próprias atribuições isoladamente.

 

Da mesma forma que as outras vezes, todo o processo se inicia com a criação da classe, note que estamos reutilizando o exemplo onde calculamos a idade do usuário visto anteriormente.

Inicialmente criada a classe Pessoa, dentro dela é criada a variável ano_atual com 2019 como valor atribuído, logo após, criamos o método construtor da classe que receberá do usuário um nome e uma idade.

Em seguida declaramos manualmente que a classe a seguir é dinâmica, por meio de @classmethod (sintaxe igual a de um decorador), o que significa que dentro desse método/função, será realizada uma determinada operação lógica e o retorno da mesma é de escopo global, acessível e utilizável por qualquer bloco de código dentro da classe Pessoa.

Sendo assim, simplesmente criamos o método/função ano_nascimento que recebe como parâmetro cls, nome, ano_nascimento. Note que pela primeira vez, apenas como exemplo, não estamos criando uma função em self, aqui é criada uma variável a critério do programador, independente, que será instanciável no escopo global e internamente será sempre interpretada pelo interpretador como self.

Desculpe a redundância, mas apenas citei este exemplo para demonstrar que self, o primeiro parâmetro de qualquer classe, pode receber qualquer nomenclatura.

 

Por fim, repare que é criada uma variável de nome pessoa2 que instancia Pessoa e repassa atributos diretamente para o método ano_nascimento.

Se não houver nenhum erro de sintaxe ocorrerão internamente o processamento das devidas funções assim como a atualização dos dados em todos métodos de classe.

Neste caso, por meio da função print( ) que recebe como parâmetro pessoa2.idade, o retorno será: 32

 

Entendido o conceito lógico de um método dinâmico (também chamado

método de classe), hora de entender o que de fato é um método estático. Raciocine que todos métodos de classe / funções criadas até agora, faziam referência ao seu escopo (self) ou instância, assim como reservavam espaços para variáveis com atributos fornecidos pelo usuário.

Ao contrário disso, se declararmos um método que não possui instâncias como atributos, o mesmo passa a ser um método estático, como uma simples função dentro da classe, acessível e instanciável por qualquer objeto.

Um método estático, por sua vez, pode ser declarado manualmente por meio da sintaxe @staticmethod uma linha antes do método propriamente dito.

 

Mudando um pouco de exemplo, inicialmente importamos da biblioteca random o módulo randint, muito usado quando é necessário se gerar números inteiros aleatórios.

Em seguida é criada a classe Pessoa, é declarada que o método gerador_id( ) dentro dela é um método estático pelo @staticmethod.

O método gerador_id( ) por sua vez simplesmente possui uma variável de nome gerador que inicializa o módulo randint especificando que seja gerado um número aleatório entre 100 e 999, retornando esse valor para gerador.

Por fim, por meio da função print( ) podemos diretamente instanciar como parâmetro a classe Pessoa executando seu método estático gerador_id( ).

Neste caso o retorno será um número gerado aleatoriamente entre 100 e 999.