Python类方法

时间:2010-01-15 15:57:58

标签: python oop

我有一个课程如下:

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 个答案:

答案 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?