Método de Classe

O decorador @classmethod, é um decorador de função embutido que é uma expressão que é avaliada depois que sua função é definida. O resultado dessa avaliação obscurece sua definição de função.
Um método de classe recebe a classe como primeiro argumento implícito, assim como um método de instância recebe a Sintaxe de instância
:

classe C (objeto):
    @classmethod
    def fun (cls, arg1, arg2, ...):
       ....
diversão: função que precisa ser convertida em um método de classe
 retorna: um método de classe para função.
  • Um método de classe é um método que está vinculado à classe e não ao objeto da classe.
  • Eles têm acesso ao estado da classe, pois leva um parâmetro de classe que aponta para a classe e não a instância do objeto.
  • Ele pode modificar um estado de classe que se aplicaria a todas as instâncias da classe. Por exemplo, ele pode modificar uma variável de classe que será aplicável a todas as instâncias.

Método Estático

Um método estático não recebe um primeiro argumento implícito.
Sintaxe:

classe C (objeto):
    @staticmethod
    def fun (arg1, arg2, ...):
        ... 
retorna: um método estático para diversão de função.
  • Um método estático também é um método vinculado à classe e não ao objeto da classe.
  • Um método estático não pode acessar ou modificar o estado da classe.
  • Está presente na aula porque faz sentido que o método esteja presente na aula.

Método de classe vs método estático



  • Um método de classe usa cls como primeiro parâmetro, enquanto um método estático não precisa de parâmetros específicos.
  • Um método de classe pode acessar ou modificar o estado da classe, enquanto um método estático não pode acessar ou modificá-lo.
  • Em geral, os métodos estáticos não sabem nada sobre o estado da classe. Eles são métodos do tipo utilitário que usam alguns parâmetros e funcionam com base nesses parâmetros. Por outro lado, os métodos de classe devem ter classe como parâmetro.
  • Usamos o decorador @classmethod em python para criar um método de classe e usamos o decorador @staticmethod para criar um método estático em python.

Quando usar o quê?

  • Geralmente usamos o método de classe para criar métodos de fábrica. Os métodos de fábrica retornam o objeto de classe (semelhante a um construtor) para diferentes casos de uso.
  • Geralmente usamos métodos estáticos para criar funções de utilidade.

Como definir um método de classe e um método estático?

Para definir um método de classe em python, usamos o decorador @classmethod e para definir um método estático usamos o decorador @staticmethod.
Vejamos um exemplo para entender a diferença entre os dois. Digamos que queremos criar uma classe Person. Agora, o python não oferece suporte à sobrecarga de método como C ++ ou Java, portanto, usamos métodos de classe para criar métodos de fábrica. No exemplo abaixo, usamos um método de classe para criar um objeto pessoa a partir do ano de nascimento.

Conforme explicado acima, usamos métodos estáticos para criar funções de utilidade. No exemplo abaixo, usamos um método estático para verificar se uma pessoa é adulta ou não.

Implementação

from datetime import date 
   
class Person: 
    def __init__(self, name, age): 
        self.name = name 
        self.age = age 
       
    
    @classmethod
    def fromBirthYear(cls, name, year): 
        return cls(name, date.today().year - year) 
       
    
    @staticmethod
    def isAdult(age): 
        return age > 18
   
person1 = Person('mayank', 21) 
person2 = Person.fromBirthYear('mayank', 1996) 
   
print (person1.age) 
print (person2.age) 
   
print (Person.isAdult(22)) 

Resultado

21
21
Verdade

Este artigo é uma contribuição de Mayank Agrawal . Se você gosta de GeeksforGeeks e gostaria de contribuir, você também pode escrever um artigo usando contribute.geeksforgeeks.org ou enviar o seu artigo para contribute@geeksforgeeks.org. Veja o seu artigo que aparece na página principal do GeeksforGeeks e ajude outros Geeks.

Escreva comentários se encontrar algo incorreto ou se quiser compartilhar mais informações sobre o tópico discutido acima.