2

次のようなPython 2.xmodule.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。は文字列であるため、明らかに機能していませんnamelist_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

少しハックですeval()が、名前である文字列を指定すると、その名前のオブジェクトが取得されます。それがたまたまクラスである場合、それは機能するはずです。

テスト:

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

更新: 他の答えははるかに優れています。

于 2011-05-11T04:42:50.813 に答える