A resposta curta
- um método de instância conhece sua instância (e, a partir disso, sua classe)
- um método de classe conhece sua classe
- um método estático não conhece sua classe ou instância
A resposta longa
Métodos de classe
Um método de classe é aquele que pertence à classe como um todo. Não requer uma instância. Em vez disso, a classe será enviada automaticamente como o primeiro argumento. Um método de classe é declarado com o decorador @classmethod
.
Por exemplo:
class Foo(object):
@classmethod
def hello(cls):
print("hello from %s" % cls.__name__)
Foo.hello()
-> "Hello from Foo"
Foo().hello()
-> "Hello from Foo"
Métodos de instância
Por outro lado, um método de instância requer uma instância para chamar e não requer decorador. Este é de longe o tipo mais comum de método.
class Foo(object):
def hello(self):
print("hello from %s" % self.__class__.__name__)
Foo.hello()
-> TypeError: hello() missing 1 required positional argument: 'self'
(nota: o acima é com python3; com python2 você terá um erro ligeiramente diferente)
Métodos estáticos
Um método estático é semelhante a um método de classe, mas não obtém o objeto de classe como um parâmetro automático. É criado usando o decorador @staticmethod
.
class Foo(object):
@staticmethod
def hello(cls):
print("hello from %s" % cls.__name__)
Foo.hello()
-> TypeError: hello() missing 1 required positional argument: 'cls'
Links de documentação
Aqui estão os links para a documentação relevante do python3:
A documentação do modelo de dados tem a dizer sobre a diferença entre métodos de classe e métodos estáticos :
Static method objects Static method objects provide a way of defeating the transformation of function objects to method objects described above. A static method object is a wrapper around any other object, usually a user-defined method object. When a static method object is retrieved from a class or a class instance, the object actually returned is the wrapped object, which is not subject to any further transformation. Static method objects are not themselves callable, although the objects they wrap usually are. Static method objects are created by the built-in staticmethod() constructor.
Class method objects A class method object, like a static method object, is a wrapper around another object that alters the way in which that object is retrieved from classes and class instances. The behaviour of class method objects upon such retrieval is described above, under “User-defined methods”. Class method objects are created by the built-in classmethod() constructor.
Perguntas relacionadas
- Qual é a diferença entre @staticmethod e @classmethod em Python? (stackoverflow)