Answers:
更好的是:使用该inspect.isclass
功能。
>>> import inspect
>>> class X(object):
... pass
...
>>> inspect.isclass(X)
True
>>> x = X()
>>> isinstance(x, X)
True
>>> y = 25
>>> isinstance(y, X)
False
type(whatever)
始终返回作为类的对象,因此此检查是多余的。如果没有,则无法实例化whatever
,因此您一开始就无法执行检查。
type(snakemake.utils)
返回<class 'module'>
,然后inspect.isclass(snakemake.utils)
返回False
。
snakemake.util
模块不是类吗?
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))
import types
types.ClassType
在Python 3中不再需要(并且已删除)。
In [8]: class NewStyle(object): ...: pass ...: In [9]: isinstance(NewStyle, (type, types.ClassType)) Out[9]: True
isinstance(object, type)
。需要注意的是对象,如int
,list
,str
,等都是同样的类,所以你不能用这个来区分在Python定义自定义类和内置的C代码定义的类。
>>> class X(object):
... pass
...
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True
'class Old:pass' 'isinstance(Old, type) == False'
,但inspect.isclass(Old) == True
。
isinstance(X, type)
返回True
if X
是class,False
如果不是,则返回。
S. Lott's answer
年龄大了四年。
Foo类:被称为旧样式类,X(object)类:被称为新样式类。
选中此选项,Python中的旧样式类和新样式类之间有什么区别?。推荐新样式。阅读有关“ 统一类型和类 ”
最简单的方法是使用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)
本杰明·彼得森(Benjamin Peterson)inspect.isclass()
对于这项工作的使用是正确的。但是请注意,您可以使用内置函数issubclass来测试Class
对象是否是特定对象Class
,因此是否是隐式对象。根据您的用例,这可能更像pythonic。Class
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
这里已经有一些可行的解决方案,但这是另一个解决方案:
>>> import types
>>> class Dummy: pass
>>> type(Dummy) is types.ClassType
True
types.ClassType
已在Python 3中删除
inspect.isclass
返回True
要检查的对象是否是类实例,请使用inspect.isclass(type(Myclass()))