Houve uma discussão no chat relacionada a uma pergunta (a pergunta em si é irrelevante para essa), que revelou que talvez eu não conheça Python.
Em minha opinião, embora a terminologia seja diferente entre os idiomas, geralmente podemos categorizar funções como:
- funções [livres]
- métodos estáticos / funções de membro estáticas
- métodos não estáticos / funções membro não estáticas
Aparentemente, no Python, existe outro tipo de função que não se encaixa nas categorias acima, uma que é um método, mas "não conhece sua classe".
O que são "métodos de classe" e "métodos de instância", em Python?
python
terminology
Corridas de leveza com Monica
fonte
fonte
Respostas:
A resposta curta
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
@classmethod
decorador.Por exemplo:
Métodos de instância
Por outro lado, um método de instância requer uma instância para chamá-lo e não requer decorador. Esse é de longe o tipo mais comum de método.
(nota: o acima é com python3; com python2 você receberá 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
@staticmethod
decorador.Links de documentação
Aqui estão os links para a documentação python3 relevante:
A documentação do modelo de dados tem a dizer sobre a diferença entre métodos de classe e métodos estáticos:
Perguntas relacionadas
fonte
"^ def("
, depois contei todas as instâncias de@staticmethod
. Muito pouco científico, mas provavelmente estava dentro do estádio.Um "método de instância" usa as informações contidas na instância para descobrir qual valor retornar (ou qual efeito colateral fazer). Estes são muito comuns.
Um "método de classe" usa informações sobre a classe (e não uma instância dessa classe) para afetar o que faz (elas geralmente são usadas para criar novas instâncias como construtores alternativos e, portanto, não são incrivelmente comuns).
Um "método estático" não usa nenhuma informação sobre a classe ou instância para calcular o que faz. Geralmente é apenas na classe por conveniência. (Como tal, também não são muito comuns.)
Uma função de X
Lembre-se da aula de matemática, "y é uma função de x
f(x)
,?" Vamos aplicar isso no código:O que está implícito acima é que, uma vez que
x
pode mudar,y
pode mudar quandox
muda. É isso que queremos dizer quando dizemos que "y
é uma função dex
"O que
y
será quandoz
é1
?2
?'FooBarBaz'
?y
não é uma função dez
, portantoz
pode ser qualquer coisa e não afetar o resultado da função, assumindo que nossafunction
é uma função pura. (Se acessarz
como uma variável global, não será uma função pura - é isso que significa pureza funcional.)Lembre-se do que foi dito acima ao ler as seguintes descrições:
Métodos de instância
Um método de instância é uma função que é uma função de uma instância . A função aceita implicitamente a instância como argumento e a instância é usada pela função para determinar a saída da função.
Um exemplo interno de um método de instância é str.lower:
str.lower
é chamado na instância da sequência e usa as informações contidas na instância para descobrir qual nova sequência retornar.Métodos de classe:
Lembre-se, em Python, tudo é um objeto. Isso significa que a classe é um objeto e pode ser passada como argumento para uma função.
Um método de classe é uma função que é uma função da classe . Ele aceita a classe como argumento.
Um exemplo embutido é
dict.fromkeys
:A função conhece implicitamente sua própria classe, a função usa a classe para afetar a saída da função e cria um novo dessa classe a partir do iterável. Um OrderedDict demonstra isso ao usar o mesmo método:
O método da classe usa informações sobre a classe (e não uma instância dessa classe) para afetar qual tipo de classe retornar.
Métodos estáticos
Você mencionou um método que "não conhece sua classe" - este é um método estático no Python. É apenas anexado por conveniência ao objeto de classe. Opcionalmente, poderia ser uma função separada em outro módulo, mas sua assinatura de chamada seria a mesma.
Um método estático não é uma função da classe nem do objeto.
Um exemplo interno de um método estático é o str.maketrans do Python 3.
Dado alguns argumentos, ele cria um dicionário que não é função de sua classe.
É conveniente porque
str
está sempre disponível no espaço de nomes global, para que você possa usá-lo facilmente com a função de conversão:No Python 2, você precisa acessá-lo no
string
módulo:Exemplo
Vamos instanciar:
Agora a instância pode chamar todos os métodos:
Mas a classe normalmente não se destina a chamar o método de instância, embora se espere chamar os outros:
Você precisaria passar explicitamente a instância para chamar o método da instância:
fonte
MyClass(1,2,3)
com isso, em vez dissoMyClass.get_special(1,2,3)
) e um método estático como apenas sendo uma função normal que poderia ficar sozinha de qualquer maneira.Um "método de instância" é um método que recebe o objeto de instância como seu primeiro parâmetro, que por convenção é chamado
self
. Esse é o padrão.Um "método estático" é um método sem o
self
parâmetro inicial . Isso é implementado com o decorador @staticmethod .Um "método de classe" é um método em que o parâmetro inicial não é um objeto de instância, mas o objeto de classe ( consulte esta parte dos documentos do Python sobre o que é um "objeto de classe"), que por convenção é chamado
cls
. Isso é implementado com o decorador @classmethod .O uso típico do termo "método estático" em C / C ++ / etc se aplica aos métodos "estático" e "classe" do Python, pois esses dois tipos de métodos não têm referência à instância. Em C / C ++ / etc, os métodos normalmente têm acesso implícito a todos os membros / métodos que não são de instância da classe, e é provavelmente por isso que essa distinção existe apenas em linguagens como Python / Ruby / etc.
fonte
Class::staticMethod()
e é isso (contanto que você não seja proibido de chamá-lo porquestaticMethod()
é privado ou algo assim).