我尝试使用函数isinstance(object,class_or_type_or_tuple)来做到这一点,但我不知道类会有什么类型。
例如,在以下代码中:
class Foo:
pass
isinstance(Foo, **???**) # i want to make this return True.
我试图用???替换"class
",但我意识到class
是Python中的关键字。
更好的方法是使用 inspect.isclass
函数。
>>> import inspect
>>> class X(object):
... pass
...
>>> inspect.isclass(X)
True
>>> x = X()
>>> isinstance(x, X)
True
>>> inspect.isclass(x)
False
inspect.isclass
在检查的对象是类实例时也返回True
,请使用inspect.isclass(type(Myclass()))
。 - michaelmeyertype(whatever)
始终返回一个类的对象,因此这个检查是多余的。如果不是这样,就无法实例化whatever
,因此您根本无法进行检查。 - a_guestsnakemake.util
是一个模块而不是一个类? - Benjamin Petersoninspect.py
模块中,isclass(object)
函数是一行代码:return isinstance(object, type)
。 - Jasha>>> class X(object):
... pass
...
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True
'class Old:pass' 'isinstance(Old, type) == False'
,但是inspect.isclass(Old) == True
。 - jfsinspect.isclass可能是最好的解决方案,而且很容易看出它实际上是如何实现的。
def isclass(obj):
"""Return true if the obj is a class.
Class objects provide these attributes:
__doc__ documentation string
__module__ name of module in which this class was defined"""
return isinstance(obj, (type, types.ClassType))
import types
。 - nguyêntypes.ClassType
在 Python 3 中不再需要(已被移除)。 - kawing-chiuisinstance(object, type)
。请注意,像 int
,list
,str
等对象也是类,因此您不能使用它来区分在Python中定义的自定义类和在C代码中定义的内置类。 - Martijn Pietersobject
。这会掩盖 Python 中重要的内置名称 object
。 - Reinderienisinstance(X, type)
如果X是类,则返回True
,否则返回False
。
import types
isinstance(X, types.ClassType)
- Charles L.这个检查适用于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
关于这个工作,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
Type[Any]
看起来不对:如果函数确实期望一个 Type[Any]
,那么它就不需要 try
/except
。 - bfontaine类 Foo:被称为旧式类,而类 X(object):被称为新式类。
查看 Python中旧式类和新式类的区别是什么?。建议使用新式类。阅读有关“类型和类的统一”的内容
class Foo(object): ...
等同于class Foo: ...
,但是为什么要从object继承的答案已经更新。 - hlongmore def isclass(cls):
return str(type(cls)).startswith("<class") and hasattr(cls, '__weakref__')
__weakref__
属性会自动添加到继承自 object 并且没有显式设置 __slots__
(不包括 __weakref__
)的用户定义类的实例中。这个属性允许对象被弱引用,意味着你可以创建对该对象的弱引用而不增加其引用计数。 - undefined最简单的方法是使用最多投票答案中发布的inspect.isclass
。
实现细节可以在python2 inspect和python3 inspect中找到。
对于新式类:isinstance(object, type)
对于旧式类:isinstance(object, types.ClassType)
嗯,对于旧式类,它使用types.ClassType
,这是来自types.py的代码:
class _C:
def _m(self): pass
ClassType = type(_C)
inspect.isclass
对我不起作用,相反,请尝试这个。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])
基本上,type(var)
是 <class 'a type'>
例如:<class 'int'
。但是,当 var
是一个类时,它会出现类似于 <class '__main__.classname'>
的东西。
所以我们将字符串分成<class '__main__
,并使用if
进行比较,如果字符串完全符合,则是一个类。
???
等于type
。参见:inspect.isclass 实现。 - Niko Pasanen