Python类中重复计算函数的模板化优化方法咨询
优化重复代码的几种方案
方案一:提取通用辅助方法(最易读、易维护)
把重复的核心逻辑抽成一个私有辅助方法,三个公共方法只需要传入对应的属性名调用它,这样只需要维护一份逻辑:
class YourClassName: # 其他类代码... def _average_end_effector_property(self, prop_name, samplingSize=cst.AVERAGE_SIZE): # 通过属性名获取对应的实例属性 target_prop = getattr(self, prop_name) if len(target_prop) < samplingSize: return -1 return sum(target_prop[-samplingSize:]) / samplingSize def averageEndEffectorVelocity(self, samplingSize=cst.AVERAGE_SIZE): return self._average_end_effector_property("eeVelocity", samplingSize) def averageEndEffectorAcceleration(self, samplingSize=cst.AVERAGE_SIZE): return self._average_end_effector_property("eeAcceleration", samplingSize) def averageEndEffectorJerk(self, samplingSize=cst.AVERAGE_SIZE): return self._average_end_effector_property("eeJerk", samplingSize)
这种方式保留了原有的三个公共方法的命名和调用方式,完全兼容原有代码,同时消除了重复逻辑,后期如果要修改计算规则(比如换用numpy求平均、调整错误返回值),只需要修改_average_end_effector_property这一个方法。
方案二:动态生成方法(适合属性数量多的场景)
如果后续可能还要添加更多类似的属性(比如eeForce、eeTorque等),可以通过动态生成方法的方式进一步减少代码量:
class YourClassName: # 其他类代码... def _average_end_effector_property(self, prop_name, samplingSize=cst.AVERAGE_SIZE): target_prop = getattr(self, prop_name) if len(target_prop) < samplingSize: return -1 return sum(target_prop[-samplingSize:]) / samplingSize # 在类定义外部动态生成三个公共方法 # 注意替换成你的实际类名 prop_method_map = [ ("eeVelocity", "averageEndEffectorVelocity"), ("eeAcceleration", "averageEndEffectorAcceleration"), ("eeJerk", "averageEndEffectorJerk") ] for prop_name, method_name in prop_method_map: # 用闭包绑定当前循环的prop_name def make_average_method(prop): def method(self, samplingSize=cst.AVERAGE_SIZE): return self._average_end_effector_property(prop, samplingSize) return method setattr(YourClassName, method_name, make_average_method(prop_name))
这样不用手动写每个公共方法的定义,新增属性时只需要在prop_method_map里加一行即可。
补充说明
原代码中用返回-1表示数据量不足的情况,若业务允许,也可以考虑抛出ValueError异常或者返回None,这样更符合Python的错误处理习惯,但如果现有业务逻辑依赖返回-1,保持原样即可。
内容的提问来源于stack exchange,提问作者Dark Patate
相关产品推荐
相关产品推荐

