如何检查模块属性是否为类

3 投票
1 回答
2041 浏览
提问于 2025-04-18 12:18

我正在使用 imp.find_moduleimp.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")

不过,如果你想深入了解,还有其他几种方法。

  1. 在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")
    
  2. 你还可以看看 数据模型类特定的魔法字段列表

撰写回答