Eu quero percorrer os métodos em uma classe ou manipular objetos de classe ou instância de maneira diferente, com base nos métodos presentes. Como obtenho uma lista de métodos de classe?
Veja também:
- Como posso listar os métodos em um módulo Python 2.5?
- Loop em um método de objeto Python / IronPython
- Localizando os métodos que um objeto possui
- Como eu olho dentro de um objeto Python?
- Como faço para executar introspecção em um objeto no Python 2.x?
- Como obter uma lista completa dos métodos e atributos do objeto?
- Descobrindo quais funções estão disponíveis em uma instância de classe em python?
binding
funciona: stackoverflow.com/a/46041480/1959808[f for f in dir(ClassName) if not f.startswith('_')]
ou apenasdir(ClassName)
para tudoRespostas:
Um exemplo (listando os métodos da
optparse.OptionParser
classe):Observe que
getmembers
retorna uma lista de 2 tuplas. O primeiro item é o nome do membro, o segundo item é o valor.Você também pode passar uma instância para
getmembers
:fonte
inspect.isroutine
pode ser um predicado mais apropriado;inspect.ismethod
não funciona para os métodos de todos os objetos.Existe o
dir(theobject)
método para listar todos os campos e métodos do seu objeto (como uma tupla) e o módulo inspecionar (como codeape write) para listar os campos e métodos com seus documentos (em "" ").Como tudo (inclusive campos) pode ser chamado em Python, não tenho certeza se existe uma função interna para listar apenas métodos. Você pode tentar se o objeto que você obtém
dir
é passível de chamada ou não.fonte
Resposta do Python 3.x sem bibliotecas externas
resultado excluído do dunder:
fonte
Digamos que você queira conhecer todos os métodos associados à classe de lista Apenas digite O seguinte
Acima fornecerá todos os métodos da classe list
fonte
print([ m for m in dir(my_class) if not m.startswith('__')])
Experimente a propriedade
__dict__
.fonte
__dict__
. No entanto classes têm um__dict__
muito e que deve exibir os métodos de classe :)você também pode importar o FunctionType dos tipos e testá-lo com o
class.__dict__
:fonte
and not x.startswith('_')
ao final da lista a compreensão para o meu uso para ignorar__init__
os métodos privados e.import
deFunctionType
usando um lambda descartável comtype()
:type(lambda:0)
isinstance
seria o melhor do quetype(y) == FunctionType
aqui.Observe que você precisa considerar se deseja que os métodos das classes base herdadas (mas não substituídas) sejam incluídos no resultado. As operações
dir()
einspect.getmembers()
incluem métodos de classe base, mas o uso do__dict__
atributo não.fonte
Isso também funciona:
mymodule.py
Em outro arquivo
resultado:
Nos documentos python:
inspect.isroutine (objeto)
fonte
assim
Think Python página 210
fonte
Existe esta abordagem:
Ao lidar com uma instância de classe , talvez seja melhor retornar uma lista com as referências de método em vez de apenas nomes¹. Se esse é seu objetivo, além de
import
__init__
) da listaPode ser útil. Em poucas palavras, para uma classe como
Poderíamos verificar a recuperação da instância com
Então você pode ligar imediatamente:
¹ Um caso de uso:
Eu usei isso para testes de unidade . Teve uma classe em que todos os métodos realizavam variações do mesmo processo - o que levava a testes demorados, cada um apenas um pouco diferente dos outros. DRY era um sonho distante.
Achei que deveria ter um único teste para todos os métodos, então fiz a iteração acima.
Embora eu tenha percebido que, em vez disso, deveria refatorar o código em si para ser compatível com DRY ... isso ainda pode servir uma alma nítida e aleatória no futuro.
fonte
Eu apenas mantenho isso lá, porque as respostas mais bem avaliadas não são claras .
Este é um teste simples com classe não usual baseada no Enum.
E isso são resultados de saída.
Então, o que temos:
dir
fornecer dados não completosinspect.getmembers
fornecer dados não completos e chaves internas que não são acessíveis comgetattr()
__dict__.keys()
forneça resultado completo e confiávelPor que os votos são tão errôneos? E onde eu estou errado? E onde outras pessoas erradas, que respondem, têm votos tão baixos?
fonte
fornece uma lista idêntica à
faz.
fonte
Se o seu método é um método "regular" e não um
statimethod
,classmethod
etc.Existe um pequeno truque que eu criei -
Isso pode ser estendido para outros tipos de métodos, alterando "função" na
if
condição correspondente.Testado em python 2.7.
fonte
Você pode listar todos os métodos em uma classe python usando o seguinte código
Isso retornará uma lista de todos os nomes dos métodos na classe
fonte
Eu sei que este é um post antigo, mas acabei de escrever esta função e a deixarei aqui, caso alguém tropece em busca de uma resposta:
fonte
Isto é apenas uma observação. "codificar" parece ser um método para objetos de string
No entanto, se str1 for inspecionado para métodos, uma lista vazia será retornada
Então, talvez eu esteja errado, mas o problema parece não ser simples.
fonte
'a'
É um objecto, cujo tipo éstr
. Você pode ver isso executandotype('a')
.inspect.getmember()
usa um parâmetro de tipo, então você precisa ligarinspect.getmember(str)
para ver o que espera.resultado
fonte
Se você deseja listar apenas métodos de uma classe python
fonte