做毕设的时候,为了让代码简洁简洁再简洁,同时为了有较好的扩展性,所以用了一点 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
使用方法
把大象装进冰箱,只需要三步:
- 构造一个类名
- 调用这个函数
- 得到类本身
例子呢
我现在有一个包 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 里面应该有现成的反射来供调用的吧?学得不深,暂没有扒到。
发表回复