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 class
es una palabra clave en python.
python
reflection
jeeyoungk
fuente
fuente
inspect.isclass
regresarTrue
si 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 instanciawhatever
y, 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.util
un 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 types
types.ClassType
ya no es necesario en Python 3 (y se elimina).In [8]: class NewStyle(object): ...: pass ...: In [9]: isinstance(NewStyle, (type, types.ClassType)) Out[9]: True
isinstance(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
True
siX
es clase yFalse
si 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.isclass
tal 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 unClass
objeto es específicoClass
y, 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.ClassType
fue eliminado en Python 3