假设一个简单的类:
class MyClass(object):
pass
.
.
.
m = MyClass
print type(m) # gets: <type 'classobj'>
# if m is classobj, how can i check a variable is class object?
我的问题是:如何检查变量是否为类对象?
一个简单的解决方案:
if str(type(m)) == "<type 'classobj'>":
# do something
但我认为至少有一种经典方法可以检查它。
答案 0 :(得分:26)
使用inspect:
import inspect
print inspect.isclass(obj)
答案 1 :(得分:16)
在2.x中,类对象可以是type
(新式类)或classobj
(经典类)。 type
类型是内置类型,但classobj
类型不是。那么,你怎么得到它?这就是types
模块的用途。
isinstance(MyClass, (types.TypeType, types.ClassType))
在3.x中,您不必担心经典类,所以:
isinstance(MyClass, type)
即使您想直接比较类型,也不应该通过str
比较任何对象。比较:
>>> class MyClassicClass:
... pass
>>> str(type(MyClassicClass)) == "<type 'classobj'>"
True
>>> str("<type 'classobj'>") == "<type 'classobj'>"
True
您几乎总是可以直接比较对象:
>>> type(MyClassicClass) == types.ClassType
True
>>> "<type 'classobj'>" == types.ClassType
False
(在极少数情况下,您确实需要比较字符串表示由于某种原因,您需要repr
,而不是str
。)
答案 2 :(得分:3)
这是你要找的吗?
>>> class A(object):
... pass
>>> isinstance(A, type)
True
>>> isinstance("asd", type)
False
但仅适用于从object继承的类。
答案 3 :(得分:3)
新样式类(在您的示例中显式地从object
派生,或在Python 3中隐式派生)不是classobj
类型。只有旧式的课程是classobj
。因此,对于您编写的示例类,您只需检查MyClass
是否是type
的实例,因为所有新样式类都是:
isinstance(MyClass, type)
因为所有新式类都来自object
,所以你也可以这样做:
issubclass(MyClass, object)
我建议反对:
type(MyClass) == type
如果类的类型不是type
,而是元类,则会失败。当然,虽然可能有用例。
如果你真的需要看看你是否有一个旧式的类,你可以导入types
模块并使用types.ClassType
,或者只是声明一个旧式的类,看看是否有你正在测试的类是同一类:
class OldStyleClass:
pass
OldStyleClass = type(OldStyleClass)
isinstance(MyClass, OldStyleClass)
答案 4 :(得分:-1)
有时下一个工作(如果你想确定如何打印对象):
def is_class(o):
return hasattr(o, '__dict__')