如何检查模块属性是否为类
我正在使用 imp.find_module
和 imp.load_module
来加载 'example'
,现在我想列出 example.py
中属于 Class A
的函数,但我找不到一个独特的 getattr
属性来过滤掉 dir(example)
中的其他方法。
for i in dir(example):
if hasattr(getattr(example, i), <some_attribute>):
print i
1 个回答
5
如果你想找现成的解决方案,可以使用内置的 inspect
模块,它有很多函数可以用来检查特定类型,像你这个情况可以用 isclass
。
import inspect
class Foo(object):
pass
if inspect.isclass(Foo):
print("Yep, it's class")
不过,如果你想深入了解,还有其他几种方法。
在Python中,所有东西都是某种东西的实例。类也不例外,它们是 metaclasses 的实例。在Python 2中,有两种类型的类——旧式类(
class Foo: pass
)和新式类(class Foo(object): pass
)。旧式类是classobj
的实例,可以看到它是types.ClassType
,而新式类是type
的实例,type
本身同时也是一个函数和元类(严格来说是可调用的元类)。在Python 3中,只有新式类,它们总是从object
继承(而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")
你还可以看看 数据模型 和 类特定的魔法字段列表。