2011-05-11 75 views
2

我有一个Python 2.x的module.py文件看起来像这样的搜索全局类:的Python:在一个单一的模块文件

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以获得我在找的东西?


更新:感谢伊格纳西奥的提示。以下是更新后的代码:

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

回答

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()  
3

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

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

1

这有点不好意思,但你可以eval()一个字符串是一个名字,它会得到一个名字的对象。如果这恰好是一个班级,那么它应该工作。

测试:

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

UPDATE:对方回答要好得多。

相关问题