我想知道如何检查变量是否是一个类(不是实例!)。
我尝试使用函数isinstance(object, class_or_type_or_tuple)
来执行此操作,但我不知道类会有什么类型。
例如,在以下代码中
class Foo: pass
isinstance(Foo, **???**) # i want to make this return True.
我尝试用 ??? 替换“class
”,但我意识到class
是python中的关键字。
答案 0 :(得分:279)
更好:使用inspect.isclass
功能。
>>> import inspect
>>> class X(object):
... pass
...
>>> inspect.isclass(X)
True
>>> x = X()
>>> isinstance(x, X)
True
>>> y = 25
>>> isinstance(y, X)
False
答案 1 :(得分:40)
inspect.isclass可能是最好的解决方案,很容易看出它是如何实现的
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))
答案 2 :(得分:32)
>>> class X(object):
... pass
...
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True
答案 3 :(得分:21)
isinstance(X, type)
如果True
是班级,则返回X
,否则返回False
。
答案 4 :(得分:2)
此检查与Python 2.x和Python 3.x兼容。
import six
isinstance(obj, six.class_types)
这基本上是一个包装函数,它执行与andrea_crotti答案相同的检查。
示例:
>>> import datetime
>>> isinstance(datetime.date, six.class_types)
>>> True
>>> isinstance(datetime.date.min, six.class_types)
>>> False
答案 5 :(得分:2)
本杰明·彼得森(Benjamin Peterson)对这项工作使用inspect.isclass()
是正确的。
但是请注意,您可以使用内置函数issubclass测试Class
对象是否是特定的Class
,并因此隐式地Class
。
根据您的用例,这可能更像pythonic。
from typing import Type, Any
def isclass(cl: Type[Any]):
try:
return issubclass(cl, cl)
except TypeError:
return False
然后可以像这样使用:
>>> class X():
... pass
...
>>> isclass(X)
True
>>> isclass(X())
False
答案 6 :(得分:1)
类Foo:被称为旧样式类,而类X(对象):被称为新样式类。
检查What is the difference between old style and new style classes in Python?。建议使用新款式。阅读“unifying types and classes”
答案 7 :(得分:1)
最简单的方法是使用最常投票答案中公布的inspect.isclass
可以在python2 inspect和python3 inspect找到实施细节
对于新式课程:isinstance(object, type)
对于旧式课程:isinstance(object, types.ClassType)
em,对于旧式类,它使用types.ClassType
,这是来自types.py的代码:
class _C:
def _m(self): pass
ClassType = type(_C)
答案 8 :(得分:0)
有另一种检查方法:
asgiref==3.3.1
astroid==2.5
autopep8==1.5.6
beautifulsoup4==4.9.3
bs4==0.0.1
certifi==2020.12.5
chardet==4.0.0
click==7.1.2
colorama==0.4.4
Django==3.0.4
Flask==1.0.2
Flask-Login==0.5.0
Flask-SQLAlchemy==2.5.1
greenlet==1.0.0
gunicorn==20.1.0
html5lib==1.1
idna==2.10
isort==5.7.0
itsdangerous==1.1.0
Jinja2==2.11.3
joblib==1.0.1
lazy-object-proxy==1.5.2
MarkupSafe==1.1.1
mccabe==0.6.1
MouseInfo==0.1.3
numpy==1.20.1
Pillow==8.2.0
PyAutoGUI==0.9.52
pycodestyle==2.7.0
PyGetWindow==0.0.9
pylint==2.7.0
PyMsgBox==1.0.9
pyperclip==1.8.2
PyRect==0.1.4
PyScreeze==0.1.27
PyTweening==1.0.3
pytz==2021.1
pywhatkit==4.7
requests==2.25.1
scikit-learn==0.24.2
scipy==1.6.2
six==1.15.0
sklearn==0.0
soupsieve==2.2.1
SQLAlchemy==1.4.12
sqlparse==0.4.1
threadpoolctl==2.1.0
toml==0.10.2
urllib3==1.26.4
webencodings==0.5.1
Werkzeug==1.0.1
wikipedia==1.4.0
wrapt==1.12.1
答案 9 :(得分:-2)
这里已经有了一些有效的解决方案,但这是另一个:
>>> import types
>>> class Dummy: pass
>>> type(Dummy) is types.ClassType
True