Como descubro um nome de classe que criou uma instância de um objeto em Python se a função da qual estou fazendo isso é a classe base da qual a classe da instância foi derivada?
Estava pensando que talvez o módulo de inspeção possa ter me ajudado aqui, mas não parece me dar o que eu quero. E, além de analisar o __class__
membro, não tenho certeza de como obter essas informações.
Respostas:
Você já tentou o
__name__
atributo da classe? ou sejatype(x).__name__
, dará o nome da turma, que eu acho que é o que você deseja.Se você ainda estiver usando o Python 2, observe que o método acima funciona apenas com classes de novo estilo (no Python 3+ todas as classes são classes de "novo estilo"). Seu código pode usar algumas classes de estilo antigo. O seguinte funciona para ambos:
fonte
dir(x.__class__)
que não lista?__class__
sobre otype
método? Assim:type(x).__name__
. A ligação de membros com sublinhado duplo não é desencorajada diretamente? Eu não consigo ver uma maneira de contornar o uso__name__
, no entanto.__class__
diretamente para ser compatível com as classes de estilo antigo, pois o tipo delas é justoinstance
.def typename(x): return type(x).__name__
Você quer o nome da classe como uma string?
fonte
tipo() ?
fonte
self.__class__.__name__
vez detype(self).__name__
obter o mesmo comportamento. A menos que haja algo datype()
função que eu não saiba?type(item)
um item da lista, o resultado será<type 'instance'>
enquantoitem.__class__.__name__
mantém o nome da classe.O código de amostra acima (quando inserido no intérprete interativo) produzirá
'__main__.A'
, ao contrário do'A'
que é produzido, se o__name__
atributo for chamado. Simplesmente passando o resultado deA.__class__
para ostr
construtor, a análise é feita para você. No entanto, você também pode usar o código a seguir se desejar algo mais explícito.Esse comportamento pode ser preferível se você tiver classes com o mesmo nome definido em módulos separados.
O código de exemplo fornecido acima foi testado no Python 2.7.5.
fonte
Exemplo:
fonte
Boa pergunta.
Aqui está um exemplo simples baseado em GHZs que pode ajudar alguém:
fonte
Como alternativa, você pode usar o
classmethod
decorador:Uso :
fonte
Além de pegar o
__name__
atributo especial , você pode precisar do nome qualificado para uma determinada classe / função. Isso é feito pegando os tipos__qualname__
.Na maioria dos casos, esses serão exatamente os mesmos, mas, ao lidar com classes / métodos aninhados, eles diferem na saída obtida. Por exemplo:
Como a introspecção é o que você procura, é sempre isso que você deve considerar.
fonte
__qualname__
é para Python 3.3+__qualname__
vs__name__
: stackoverflow.com/questions/58108488/what-is-qualname-in-pythonPara obter o nome da classe da instância:
ou
ambos são iguais
fonte