我有一个课程如下:
class X:
def __init__(self):
self.sum_x =0.0
self.sum_x_squared=0.0
self.var_x =0.0
self.sum_y =0.0
self.sum_y_squared=0.0
self.var_y =0.0
def update(self,data):
[x,y,vx,vy]=data
self.update_sums(self.sum_x,self.sum_x_squared,x)
self.update_sums(self.sum_y,self.sum_y_squared,y)
.
def update_sums(self,sums,squares,val):
sums += val
squares += val*val
.
我想将成员变量sum_x
,sum_x_squared
等传递给update_sums
函数以进行更新,我该怎么做,我很困惑。
由于
答案 0 :(得分:5)
首先,请注意您的问题与classmethod(在Python中生成 class 方法)无关 - 它完全与普通的实例方法有关(你应该编辑你的标题......或者你的问题,如果你做意味着它是关于类方法的。)
对于现有的Q,执行所需操作的唯一方法是传递方法需要设置的属性的名称(或者让方法重建名称的足够数据) ),例如:
def update(self,data):
x, y, vx, vy = data
self.update_sums('x' , x)
self.update_sums('y' , y)
def update_sums(self, attname, val):
sums = 'sum_' + attname
setattr(self, sums, getattr(self, sums, 0) + val)
sums = 'sum_' + attname + '_squared'
setattr(self, sums, getattr(self, sums, 0) + val * val)
一般来说,我不推荐这种方法,因为它使代码更加庞大,可读性更低,而且效率略低于仅对硬件编码属性名称的基本方法。如果辅助方法(这里update_sums
)封装了很多棘手的逻辑,你真的很想避免重复,也许;但是,尽管消除重复是一项非常有价值的任务,但要避免过度使用它需要品味和平衡; - )。
答案 1 :(得分:2)
除了self
之外,你不需要传递任何东西,无论如何你都要这样做:
def update_sums(self, val):
self.sum += val
self.sum_squared += val * val
...
电话会议如下:self.update_sums(x)
到目前为止你设计课程的方式不是很有用或灵活,我建议这样做:
class X:
def __init__(self):
self.sums = [0] * 4
self.sums_squared = [0] * 4
def update(self, data):
self.update_sums(data)
def update_sums(self, vals):
self.sums = [i + j for i, j in zip(self.sums, vals)]
self.sums_squared = [i + j*j for i, j in zip(self.sums, vals)]
它仍然不理想,因为我不知道这一切的目的是什么,但最好拥有所有这些价值。
答案 2 :(得分:1)
没有必要。您可以直接访问self.sumx等。
你确定这些功能属于X类吗?您似乎缺少分号和空白格式。
答案 3 :(得分:1)
您不必传递它们,update_sums可以像更新一样访问它们。
答案 4 :(得分:1)
在我看来,还有另一堂课想要被释放。我会通过重构这样的代码来删除重复:
class SumOfSquares(object):
def __init__(self):
self.sum = 0.0
self.squares = 0.0
def update(self, val):
self.sum += val
self.squares += val * val
class X(object):
def __init__(self):
self.x = SumOfSquares()
self.y = SumOfSquares()
def update(self,data):
[x,y,vx,vy]=data
self.x.update(x)
self.y.update(y)
答案 5 :(得分:0)
self.sumx,self.sum_x_squared?