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