如何检查module属性是否为Class

时间:2014-07-07 02:26:38

标签: python

我正在使用imp.find_module然后imp.load_module来加载'example',现在我想列出example.pyClass A函数的列表{{1}但我似乎无法找到Classes独有的getattr属性,它会过滤掉dir(example)中的所有其他方法。

for i in dir(example):
    if hasattr(getattr(example, i), <some_attribute>):
        print i

1 个答案:

答案 0 :(得分:5)

如果您搜索现有解决方案,请使用内置inspect模块,它有足够的功能来测试特定类型,isclass适合您的情况:

import inspect

class Foo(object):
    pass

if inspect.isclass(Foo):
   print("Yep, it's class")

但是,如果你想进入深度,那么很少有其他方法。

  1. 在Python中,一切都是事物的实例。类不是排除,它们是元类的实例。在Python 2中,有两种类 - 旧式(class Foo: pass)和新式(class Foo(object): pass)。旧式类是classobj的实例,可见为types.ClassType,而新式类是type的实例,它本身同时是函数和元类(可调用的元类到要严格。在Python 3中,只有新式类,总是派生自object(后者又是type的实例)。

    因此,你可以检查Foo是否是类,通过发出它是否是产生类的元类的实例:

    class Foo(object):
        pass
    
    if isinstance(Foo, type):
        print("Yep, it's new-style class")
    

    或旧式:

    import types
    
    class Foo:
        pass
    
    if isinstance(Foo, types.ClassType):
        print("Yep, it's old-style class")
    
  2. 您还可以查看data modellist of class-specific magic fields