Eu queria saber como verificar se uma variável é uma classe (não uma instância!) Ou não.
Eu tentei usar a função isinstance(object, class_or_type_or_tuple)
para fazer isso, mas não sei que tipo uma classe terá.
Por exemplo, no código a seguir
class Foo: pass
isinstance(Foo, **???**) # i want to make this return True.
Eu tentei substituir " class
" por ??? , mas percebi que class
é uma palavra-chave em python.
python
reflection
jeeyoungk
fonte
fonte
inspect.isclass
a devoluçãoTrue
se o objeto para inspecionar é uma instância de classe , o usoinspect.isclass(type(Myclass()))
type(whatever)
sempre retorna um objeto que é uma classe, portanto essa verificação é redundante. Caso contrário, não haveria maneira de instanciarwhatever
e, portanto, você não poderia executar a verificação em primeiro lugar.type(snakemake.utils)
retorna<class 'module'>
e aindainspect.isclass(snakemake.utils)
retornaFalse
.snakemake.util
um módulo não é uma classe?A inspect.isclass é provavelmente a melhor solução e é realmente fácil ver como ela é realmente implementada
fonte
import types
types.ClassType
não é mais necessário no Python 3 (e é removido).In [8]: class NewStyle(object): ...: pass ...: In [9]: isinstance(NewStyle, (type, types.ClassType)) Out[9]: True
isinstance(object, type)
. Note-se que objetos comoint
,list
,str
, etc, são também as classes, para que você não pode usar isso para distinguir entre classes personalizadas definidas em Python e built-in classes definidas no código C .fonte
'class Old:pass' 'isinstance(Old, type) == False'
masinspect.isclass(Old) == True
.Retorne
True
seX
for classe eFalse
se não for.fonte
S. Lott's answer
, quatro anos mais velho.Essa verificação é compatível com o Python 2.xe o Python 3.x.
Essa é basicamente uma função de wrapper que executa a mesma verificação que na resposta andrea_crotti.
Exemplo:
fonte
classe Foo: é chamada classe de estilo antigo e classe X (objeto): é chamada nova classe de estilo.
Verifique isso Qual é a diferença entre o estilo antigo e as novas classes de estilo no Python? . Novo estilo é recomendado. Leia sobre " unificação de tipos e classes "
fonte
A maneira mais simples é usar
inspect.isclass
como postado na resposta mais votada.os detalhes da implementação podem ser encontrados em python2 inspecionar e python3 inspecionar .
para classe de estilo novo:
isinstance(object, type)
para classe de estilo antigo:
isinstance(object, types.ClassType)
em, para classe de estilo antigo, está usando
types.ClassType
, aqui está o código de types.py :fonte
Benjamin Peterson está correto sobre o uso de
inspect.isclass()
para este trabalho. Mas observe que você pode testar se umClass
objeto é um específicoClass
e, portanto, implicitamente aClass
, usando a função interna issubclass . Dependendo do seu caso de uso, isso pode ser mais pitônico.Pode então ser usado assim:
fonte
Já existem algumas soluções de trabalho aqui, mas aqui está outra:
fonte
types.ClassType
foi removido em Python 3