Me preguntaba cómo verificar si una variable es una clase (¡no una instancia!) O no.
Intenté usar la función isinstance(object, class_or_type_or_tuple)para hacer esto, pero no sé qué tipo tendría una clase.
Por ejemplo, en el siguiente código
class Foo: pass
isinstance(Foo, **???**) # i want to make this return True.
Traté de sustituir " class" con ??? , pero me di cuenta de que classes una palabra clave en python.
python
reflection
jeeyoungk
fuente
fuente

inspect.isclassregresarTruesi el objeto a inspeccionar es una instancia de clase , useinspect.isclass(type(Myclass()))type(whatever)siempre devuelve un objeto que es una clase, por lo que esta comprobación es redundante. Si no fuera así, no habría forma de crear una instanciawhatevery, por lo tanto, no podría realizar la verificación en primer lugar.type(snakemake.utils)regresa<class 'module'>y aúninspect.isclass(snakemake.utils)regresaFalse.snakemake.utilun módulo no es una clase?Inspect.isclass es probablemente la mejor solución, y es realmente fácil ver cómo se implementa realmente
fuente
import typestypes.ClassTypeya no es necesario en Python 3 (y se elimina).In [8]: class NewStyle(object): ...: pass ...: In [9]: isinstance(NewStyle, (type, types.ClassType)) Out[9]: Trueisinstance(object, type). Tenga en cuenta que los objetos comoint,list,str, etc, son también las clases, por lo que no puede usar esto para distinguir entre clases personalizadas definidas en Python y incorporados en las clases definidas en el código C .fuente
'class Old:pass' 'isinstance(Old, type) == False'peroinspect.isclass(Old) == True.Regrese
TruesiXes clase yFalsesi no.fuente
S. Lott's answer, que es cuatro años mayor.Esta comprobación es compatible con Python 2.xy Python 3.x.
Esta es básicamente una función de contenedor que realiza la misma verificación que en la respuesta andrea_crotti.
Ejemplo:
fuente
clase Foo: se llama clase de estilo antiguo y clase X (objeto): se llama clase de estilo nuevo.
Comprueba esto ¿Cuál es la diferencia entre las clases de estilo antiguo y nuevo en Python? . Se recomienda un nuevo estilo. Lea sobre " tipos y clases unificadores "
fuente
La forma más sencilla es utilizarlo
inspect.isclasstal como aparece en la respuesta más votada.los detalles de implementación se pueden encontrar en python2 inspect y python3 inspect .
para la clase de estilo nuevo:
isinstance(object, type)para la clase de estilo antiguo:
isinstance(object, types.ClassType)em, para la clase de estilo antiguo, está utilizando
types.ClassType, aquí está el código de types.py :fuente
Benjamin Peterson tiene razón sobre el uso de
inspect.isclass()este trabajo. Pero tenga en cuenta que puede probar si unClassobjeto es específicoClassy, por lo tanto, implícitamenteClass, utilizando la función incorporada issubclass . Dependiendo de su caso de uso, esto puede ser más pitónico.Entonces se puede usar así:
fuente
Ya hay algunas soluciones de trabajo aquí, pero aquí hay otra:
fuente
types.ClassTypefue eliminado en Python 3