Python类方法

0 投票
6 回答
1673 浏览
提问于 2025-04-15 18:04

我有一个类,内容如下:

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_xsum_x_squared 等传递给 update_sums 函数,以便更新它们,我有点困惑,不知道该怎么做。

谢谢

6 个回答

1

没必要。你可以直接访问 self.sumx 等。

你确定这些函数属于类 X 吗?你似乎缺少了分号和空格格式。

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)]

虽然这仍然不是最理想的,因为我不知道这个整个东西的目的是什么,但总比把所有那些值都放在一起要好。

5

首先,注意你的问题和classmethod(用于创建类方法的功能)没有关系——你的问题完全是关于普通的实例方法(如果你真的是想问方法,建议你修改一下标题或问题内容)。

就目前的问题来看,想要实现你想要的功能,唯一的方法就是传递需要设置的属性的名称(或者提供足够的数据让方法自己重建这些名称),例如:

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)包含了很多复杂的逻辑,而你又很想避免重复代码,那或许可以考虑;不过,消除重复代码确实是个值得做的事情,但要有分寸,避免过度使用这种方法;-)。

撰写回答