How to check whether a variable is a class or not?

I was wondering how to check whether a variable is a class (not an instance!) or not.

I've tried to use the function isinstance(object, class_or_type_or_tuple) to do this, but I don't know what type would a class will have.

For example, in the following code

class Foo: pass isinstance(Foo, **???**) # i want to make this return True. 

I tried to substitute "class" with ???, but I realized that class is a keyword in python.

12 Answers

Even better: use the inspect.isclass function.

>>> import inspect >>> class X(object): ... pass ... >>> inspect.isclass(X) True >>> x = X() >>> isinstance(x, X) True >>> inspect.isclass(x) False 
7
>>> class X(object): ... pass ... >>> type(X) <type 'type'> >>> isinstance(X,type) True 
7

The inspect.isclass is probably the best solution, and it's really easy to see how it's actually implemented

def isclass(object): """Return true if the object is a class. Class objects provide these attributes: __doc__ documentation string __module__ name of module in which this class was defined""" return isinstance(object, (type, types.ClassType)) 
7
isinstance(X, type) 

Return True if X is class and False if not.

3

This check is compatible with both Python 2.x and Python 3.x.

import six isinstance(obj, six.class_types) 

This is basically a wrapper function that performs the same check as in andrea_crotti answer.

Example:

>>> import datetime >>> isinstance(datetime.date, six.class_types) >>> True >>> isinstance(datetime.date.min, six.class_types) >>> False 

Benjamin Peterson is correct about the use of inspect.isclass() for this job. But note that you can test if a Class object is a specific Class, and therefore implicitly a Class, using the built-in function issubclass. Depending on your use-case this can be more pythonic.

from typing import Type, Any def isclass(cl: Type[Any]): try: return issubclass(cl, cl) except TypeError: return False 

Can then be used like this:

>>> class X(): ... pass ... >>> isclass(X) True >>> isclass(X()) False 

class Foo: is called old style class and class X(object): is called new style class.

Check this What is the difference between old style and new style classes in Python? . New style is recommended. Read about "unifying types and classes"

1

simplest way is to use inspect.isclass as posted in the most-voted answer.
the implementation details could be found at python2 inspect and python3 inspect.
for new-style class: isinstance(object, type)
for old-style class: isinstance(object, types.ClassType)
em, for old-style class, it is using types.ClassType, here is the code from types.py:

class _C: def _m(self): pass ClassType = type(_C) 

There is an alternative way to check it:

import inspect class cls(): print(None) inspect.isclass(cls) 

Reference:

Well, inspect.isclass is not working for me, instead, try this

class foo: pass var = foo() if str(type(var)).split(".")[0] == "<class '__main__": print("this is a class") else: print(str(type(var)).split(".")[0]) 

So basically, type(var) is <class 'a type'>

Example: <class 'int' But, when var is a class, it will appear something like <class '__main__.classname'>

So we split the string into <class '__main__ and we compare using if, if the string fit perfectly then it's a class

enter image description here

1

In some cases (depending on your system), a simple test is to see if your variable has a __module__ attribute.

if getattr(my_variable,'__module__', None): print(my_variable, ".__module__ is ",my_variable.__module__) else: print(my_variable,' has no __module__.') 

int, float, dict, list, str etc do not have __module__

There are some working solutions here already, but here's another one:

>>> import types >>> class Dummy: pass >>> type(Dummy) is types.ClassType True 
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like