如何检查module属性是否为Class

use*_*349 2 python

我正在使用imp.find_module然后imp.load_module加载'example',现在我想要列出只是函数example.py的函数,Class A但是我似乎无法找到getattrClasses特有的属性,它会过滤掉所有其他方法dir(example).

for i in dir(example):
    if hasattr(getattr(example, i), <some_attribute>):
        print i
Run Code Online (Sandbox Code Playgroud)

tor*_*gen 5

如果您搜索现有的解决方案,请使用内置inspect模块,它有很多功能可以测试特定类型,isclass对于您的情况:

import inspect

class Foo(object):
    pass

if inspect.isclass(Foo):
   print("Yep, it's class")
Run Code Online (Sandbox Code Playgroud)

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

  1. 在Python中,一切都是某事的实例.类不是排除,它们是元类的实例.在Python 2中有两种类 - old-style(class Foo: pass)和new-style(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")
    
    Run Code Online (Sandbox Code Playgroud)

    或者对于旧式:

    import types
    
    class Foo:
        pass
    
    if isinstance(Foo, types.ClassType):
        print("Yep, it's old-style class")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您还可以查看数据模型特定于类的魔术字段列表.