You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:05:30