Python 如何检查变量是否为类对象

Python 如何检查变量是否为类对象,python,class,python-2.7,Python,Class,Python 2.7,假设一个简单的类: 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? 类MyClass(对象): 通过 . . . m=MyClass 打印类型(m)#获取: #如果m是classobj,如何检查变量是否为class对象?

假设一个简单的类:

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?
类MyClass(对象):
通过
.
.
.
m=MyClass
打印类型(m)#获取:
#如果m是classobj,如何检查变量是否为class对象?
我的问题是:如何检查变量是否为类对象

一个简单的解决方案:

if str(type(m)) == "<type 'classobj'>":
    # do something
如果str(类型(m))==“”:
#做点什么

但我认为至少有一种经典的方法可以验证这一点。

这就是你想要的吗

>>> class A(object):
...    pass
>>> isinstance(A, type)
True

>>> isinstance("asd", type)
False

但仅适用于从对象继承的类。

在2.x中,类对象可以是
类型(新式类)或
classobj
(经典类)。
type
类型是内置的,但是
classobj
类型不是。那么,你是如何得到它的?这就是模块的用途

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
>>类MyClassicClass:
...     通过
>>>str(类型(MyClassicClass))=“”
真的
>>>str(“”=“”)
真的
您几乎总是可以直接比较对象:

>>> type(MyClassicClass) == types.ClassType
True
>>> "<type 'classobj'>" == types.ClassType
False
>>类型(MyClassCClass)==types.ClassType
真的
>>>“”==types.ClassType
假的
(在极少数情况下,由于某种原因确实需要比较字符串表示形式,您需要的是
repr
,而不是
str

一个新样式的类(如您的示例中显式地从
对象派生,或在Python 3中隐式派生)不是
classobj
。只有旧式类是
classobj
s。因此,对于编写的示例类,只需检查
MyClass
是否是
type
的实例,所有新样式类都是:

isinstance(MyClass, type)
因为所有新样式的类都是从
对象派生的
,所以您还可以执行以下操作:

issubclass(MyClass, object)
我建议不要:

type(MyClass) == type
如果类的类型不是
type
,而是元类,则此操作将失败。当然,尽管可能有这样的用例

如果您确实需要查看是否有旧样式的类,则可以导入
类型
模块并使用
类型.ClassType
,或者只声明一个旧样式的类,查看您正在测试的类是否属于同一类型:

class OldStyleClass:
   pass
OldStyleClass = type(OldStyleClass)

isinstance(MyClass, OldStyleClass)
使用:


有时,下一步工作正常(如果要确定如何打印对象):


上面显示的代码不会为
type(m)
打印
,因为
m
是一个新样式的类。它将打印
。经典课程只能获得
。太好了,提前谢谢。这是一个很好的答案+1(如果我可以的话会更多)+1。我喜欢Jochen的答案,因为它简单,但这是一个很好的解释。请参见
class\u types
。我很确定这不是OP想要的。检查模块+1为什么我没有想到。。。(+1)我不知道我怎么会忘记这一点,但这是一个比我(和我的等价物)更好的答案。@abarnert--是的,但你的解释了它是如何工作的,这绝对值得保留。好的,只要这一个被接受。包括类在内的大多数对象都有这个attribute@pylover对不起,我回答了另一个问题:“如何确定变量是否为类实例”。我同意你的观点。但是你能给出一个非类且具有此属性的对象的示例吗?不,问题是
如何检查变量是否为类**对象**,而不是实例对于类或类,你的方法总是返回trueinstance@pylover
i=int(5)
是一个
对象
,因为
IsubClass(int,object)
True
,但是该方法为int返回
False
,因为
int
不是真正的用户定义类。因此,它不是真正类的实例。
import inspect
print inspect.isclass(obj)
def is_class(o):
    return hasattr(o, '__dict__')