クラスメソッドの抽出

havana から「クラスメソッドだけを引っ張り出す方法ナイ?」って話を振られて、今日はそれで遊んでた。
が、どーも「これだ!」と思えるものが出てこない。

im_self を参照すればいいんじゃないでしょうか。

def get_class_method_list(klass):
    return [name for name in dir(klass) if is_class_method(klass, name)]

def is_class_method(klass, name):
    attr = getattr(klass, name)
    return bool(callable(attr) and hasattr(attr, 'im_self') and attr.im_self == klass)

if __name__ == '__main__':
    class hoge(object):
        @classmethod
        def cm_foo(self): pass

        def im_bar(self): pass

    print "\n".join(get_class_method_list(hoge))

属性値が callable で im_self を持っていて、且つ im_self がクラスと一致するならクラスメソッド。分かってみれば、割合単純な話。
native なモジュールや built-in なクラスでうまくいくかどうかは知らない。