2

我有一个module.py看起来像这样的 Python 2.x 文件:

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')
4

3 回答 3

3

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

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

于 2011-05-11T04:42:08.220 回答
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()    
于 2011-05-11T05:00:38.860 回答
1

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

测试:

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

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

于 2011-05-11T04:42:50.813 回答