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

pyl*_*ver 12 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?
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何检查变量是否为类对象?

简单的解决方案:

if str(type(m)) == "<type 'classobj'>":
    # do something
Run Code Online (Sandbox Code Playgroud)

但我认为至少有一种经典方法可以检查.

Joc*_*zel 28

使用检查:

import inspect
print inspect.isclass(obj)
Run Code Online (Sandbox Code Playgroud)


aba*_*ert 16

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

isinstance(MyClass, (types.TypeType, types.ClassType))
Run Code Online (Sandbox Code Playgroud)

在3.x中,您不必担心经典类,因此:

isinstance(MyClass, type)
Run Code Online (Sandbox Code Playgroud)

即使您想直接比较类型,也不应该按照它们来比较任何对象str.相比:

>>> class MyClassicClass:
...     pass
>>> str(type(MyClassicClass)) == "<type 'classobj'>"
True
>>> str("<type 'classobj'>") == "<type 'classobj'>"
True
Run Code Online (Sandbox Code Playgroud)

您几乎总是可以直接比较对象:

>>> type(MyClassicClass) == types.ClassType
True
>>> "<type 'classobj'>" == types.ClassType
False
Run Code Online (Sandbox Code Playgroud)

(在非常罕见的情况下,你真的需要比较字符串表示由于某种原因,你想要的repr,而不是str.)


kin*_*all 7

新式类(object在您的示例中显式派生自,或在 Python 3 中隐式派生)不是 type classobj。只有旧式的类是classobjs。因此,对于您编写的示例类,您可以简单地检查是否MyClass是 的实例type,因为所有新式类都是:

isinstance(MyClass, type)
Run Code Online (Sandbox Code Playgroud)

因为所有新式类都是从object你派生出来的,你也可以这样做:

issubclass(MyClass, object)
Run Code Online (Sandbox Code Playgroud)

我建议不要:

type(MyClass) == type
Run Code Online (Sandbox Code Playgroud)

如果类的类型不是type,而是元类,这将失败。当然,尽管可能会有用例。

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

class OldStyleClass:
   pass
OldStyleClass = type(OldStyleClass)

isinstance(MyClass, OldStyleClass)
Run Code Online (Sandbox Code Playgroud)