Python 中一个有用的反射函数

做毕设的时候,为了让代码简洁简洁再简洁,同时为了有较好的扩展性,所以用了一点 Python 的反射。PHP 中有 call_user_function,但是在 Python 里面好像并没有发现官方的反射调用方法。找了好久,发现了一个用起来还算顺手的。

代码

代码很短。

def reflect_get_class(class_full_name):
    """# Get the class by name.
    # Input: full class name
    # Output: the class itself"""parts = class_full_name.split('.')
    module = ".".join(parts[:-1])
    m = __import__(module)
    for comp in parts[1:]:
        m = getattr(m, comp)
    return m

使用方法

把大象装进冰箱,只需要三步:

  1. 构造一个类名
  2. 调用这个函数
  3. 得到类本身

例子呢

我现在有一个包 feature,里面是各种特征提取器,例如 lbp、hog 什么的。每个特征提取器都是采用蛇形命名的独立文件 feature_xxx,里面实现类是使用驼峰命名的 FeatureXxx

那么,我就可以这样调用:

for feature in ['lbp', 'hog', 'rbm', 'gabor']:
    feature_class_name = "features.feature_{}.Feature{}".format(feature_name, feature_name.capitalize())
    feature_class_obj = reflect_get_class(feature_class_name)(feature_conf)
    feature_class_obj.extract(image)

最后

自用而已啦,不知道效率如何。比如在 这里、和 这里

当然,Python 里面应该有现成的反射来供调用的吧?学得不深,暂没有扒到。

留下评论