我有一個具有三個功能的類,它們執行幾乎相同的事情但在不同的物件上。而且我認為有更好的編程方法,因為它是代碼的重復,但我看不出如何擁有一種模板。這是我的例子:
def averageEndEffectorVelocity(self, samplingSize=cst.AVERAGE_SIZE):
if len(self.eeVelocity) < samplingSize:
return -1
else:
return sum(self.eeVelocity[-samplingSize:])/samplingSize
def averageEndEffectorAcceleration(self, samplingSize=cst.AVERAGE_SIZE):
if len(self.eeAcceleration) < samplingSize:
return -1
else:
return sum(self.eeAcceleration[-samplingSize:])/samplingSize
def averageEndEffectorJerk(self, samplingSize=cst.AVERAGE_SIZE):
if len(self.eeJerk) < samplingSize:
return -1
else:
return sum(self.eeJerk[-samplingSize:])/samplingSize
可以看到,每個函式都在計算samplingSize速度、加速度和加加速度的最后一個值的平均值。有沒有辦法獲得更好的代碼?
uj5u.com熱心網友回復:
使這個函式完全作用于傳遞給它的引數(可以是類或靜態方法,或者完全在類之外重構):
def averageEndEffector(data, samplingSize=cst.AVERAGE_SIZE):
if len(data) < samplingSize:
return -1
else:
return sum(data[-samplingSize:])/samplingSize
現在您的所有實體方法都可以簡單地采用以下形式:
def averageEndEffectorVelocity(self, samplingSize=cst.AVERAGE_SIZE):
return averageEndEffector(data=self.eeVelocity, samplingSize=cst.AVERAGE_SIZE)
uj5u.com熱心網友回復:
您可以像這樣結合使用一種方法
def averageEndEffector(self, effector, samplingSize=cst.AVERAGE_SIZE):
value = getattr(self, effector)
if len(value) < samplingSize:
return -1
else:
return sum(value[-samplingSize:])/samplingSize
效應器可以是 eeVelocity、eeAcceleration 或 eeJerk(您可以洗掉 'ee' 并將此前綴添加到 getattr 函式,最好使用 const)
uj5u.com熱心網友回復:
考慮一下:
def averageEndParameter(self, whichQuantity, samplingSize=cst.AVERAGE_SIZE):
if (whichQuantity not in ["eeVelocity", "eeAcceleration", "eeJerk"]): # List of known Parameters
return -1
if len(self.__getattribute__(whichQuantity)) < samplingSize:
return -1
else:
return sum(self.__getattribute__(whichQuantity)[-samplingSize:])/samplingSize
像這樣使用它:
averageEndParameter("eeVelocity")
averageEndParameter("eeAcceleration")
averageEndParameter("eJerk")
您可以通過將這些專案添加到已知引數串列中來將其擴展到較新的引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515145.html
標籤:Python功能模板
上一篇:如何簡化可變引數模板函式?
下一篇:函式模板在需要呼叫時不考慮
