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.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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
Method 2
>>> class X(object): ... pass ... >>> type(X) <type 'type'> >>> isinstance(X,type) True
Method 3
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))
Method 4
isinstance(X, type)
Return True if X is class and False if not.
Method 5
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
Method 6
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
Method 7
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“
Method 8
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)
Method 9
There is an alternative way to check it:
import inspect
class cls():
print(None)
inspect.isclass(cls)
Reference: https://www.kite.com/python/docs/inspect.isclass
Method 10
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
Method 11
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__
Method 12
There are some working solutions here already, but here’s another one:
>>> import types >>> class Dummy: pass >>> type(Dummy) is types.ClassType True
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0
