Eu já vi muitos exemplos de pessoas extraindo todas as classes de um módulo, geralmente algo como:
# foo.py
class Foo:
pass
# test.py
import inspect
import foo
for name, obj in inspect.getmembers(foo):
if inspect.isclass(obj):
print obj
Impressionante.
Mas não consigo descobrir como obter todas as classes do módulo atual .
# foo.py
import inspect
class Foo:
pass
def print_classes():
for name, obj in inspect.getmembers(???): # what do I do here?
if inspect.isclass(obj):
print obj
# test.py
import foo
foo.print_classes()
Provavelmente isso é algo realmente óbvio, mas não consegui encontrar nada. Alguém pode me ajudar?
python
reflection
inspect
mcccclean
fonte
fonte
"class"
? Por que isso não funciona?Respostas:
Tente o seguinte:
No seu contexto:
E ainda melhor:
Porque
inspect.getmembers()
leva um predicado.fonte
from optparse import OptionParser
) , esses módulos serão incluídos na lista de impressão. Como posso evitar isso?inspect.getmembers(sys.modules[__name__], lambda member: member.__module__ == __name__ and isnpect.isclass)
dict(inspect.getmembers(sys.modules[__name__])) == globals()
é sempreTrue
, então por que as importações?inspect.getmembers(sys.modules[__name__], lambda member: inspect.isclass(member) and member.__module__ == __name__
isclass
.A respeito
?
fonte
isinstance(obj, types.ClassType)
pudb
seu programa , são executados dessa maneira, o que resulta em código quesys.modules
quebra aleatoriamente durante a depuração.globals()
parece um pouco feio, mas parece ser muito mais confiável.Não sei se existe uma maneira 'adequada' de fazê-lo, mas o seu trecho está no caminho certo: basta adicionar
import foo
ao foo.py, doinspect.getmembers(foo)
e ele deve funcionar bem.fonte
Consegui obter tudo o que precisava do
dir
plus incorporadogetattr
.No entanto, ele sai parecendo uma bola de pêlo:
fonte
Observe que o módulo do navegador de classe Python do stdlib usa análise de fonte estática, portanto, ele funciona apenas para módulos suportados por um
.py
arquivo real .fonte
Se você deseja ter todas as classes pertencentes ao módulo atual, você pode usar o seguinte:
Se você usar a resposta da Nadia e estiver importando outras classes no seu módulo, essas classes também serão importadas.
É por isso que
member.__module__ == __name__
está sendo adicionado ao predicado usadois_class_member
. Esta declaração verifica se a classe realmente pertence ao módulo.Um predicado é uma função (solicitável), que retorna um valor booleano.
fonte
Outra solução que funciona em Python 2 e 3:
fonte
Esta é a linha que eu uso para obter todas as classes que foram definidas no módulo atual (ou seja, não importadas). É um pouco longo, de acordo com o PEP-8, mas você pode alterá-lo como achar melhor.
Isso fornece uma lista dos nomes das classes. Se você quiser os próprios objetos de classe, apenas mantenha obj.
Isso tem sido mais útil na minha experiência.
fonte
fonte
Eu acho que você pode fazer algo assim.
se você precisar de aulas próprias
fonte
Costumo encontrar-me escrevendo utilitários de linha de comando em que o primeiro argumento se refere a uma de muitas classes diferentes. Por exemplo
./something.py feature command —-arguments
, ondeFeature
é uma classe ecommand
é um método nessa classe. Aqui está uma classe base que facilita isso.A suposição é que essa classe base reside em um diretório ao lado de todas as suas subclasses. Você pode ligar
ArgBaseClass(foo = bar).load_subclasses()
para retornar um dicionário. Por exemplo, se o diretório estiver assim:Assumindo
feature.py
implementosclass Feature(ArgBaseClass)
, a invocação acimaload_subclasses
retornará{ 'feature' : <Feature object> }
. O mesmokwargs
(foo = bar
) será passado para aFeature
classe.fonte