Python:在单个模块文件中搜索全局类

时间:2011-05-11 04:36:44

标签: python python-module globals

我有一个Python 2.x module.py文件,如下所示:

class A(object):
    KEYWORD = 'Class A'

class B(A):
    KEYWORD = 'Class B'

class C(object):
    pass

def list_class_keywords():
    for name in globals():
        print name, hasattr(name, 'KEYWORD')

if __name__ == '__main__':
    list_class_keywords()

list_class_keywords()中,我循环遍历此文件模块的所有对象,并测试对象是否具有属性KEYWORD。显然它不起作用,因为name是一个字符串。我应该如何重写list_classes以获得我正在寻找的东西?


更新:感谢Ignacio的提示。这是更新的代码:

def list_class_keywords():
    global_dict = globals()
    for name in global_dict:
        obj = global_dict[name]
        print name, hasattr(obj, 'KEYWORD')

3 个答案:

答案 0 :(得分:3)

globals()是一本字典。索引它。

但你应该使用装饰器来枚举类。

答案 1 :(得分:2)

class A(object):
    KEYWORD = 'Class A'

class B(A):
    KEYWORD = 'Class B'

class C(object):
    pass

def list_class_keywords():
    for name, obj in globals().items():
        print name, hasattr(obj, 'KEYWORD')

if __name__ == '__main__':
    list_class_keywords()    

答案 2 :(得分:1)

有点hacky,但你可以eval()一个名字的字符串,它将获得一个具有该名称的对象。如果这恰好是一个类,那么它应该可以工作。

测试:

>>>> class Object:
....     pass
.... 
>>>> eval("Object")
<class __main__.Object at 0x0000000102a62bc0>
>>>> 

更新:另一个答案要好得多。