Python类方法

mik*_*kip 0 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
          .
Run Code Online (Sandbox Code Playgroud)

我想通过成员变量sum_x,sum_x_squared等等的update_sums功能更新我怎么做到这一点,我很困惑.

谢谢

Ale*_*lli 5

首先,请注意你的问题无关,与类方法(这使得在Python方法) -这是完全正常的左右实例方法(你应该修改你的标题...或者你的问题,如果你意味着它是关于方法).

对于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)
Run Code Online (Sandbox Code Playgroud)

一般而言,我不推荐这种方法,因为它使代码更笨,更不易读,并且比仅仅硬编码属性名称的基本方法效率稍低.如果辅助方法(这里update_sums)封装了很多棘手的逻辑,你真的非常希望避免重复,也许; 但是,尽管消除重复是一项非常有价值的任务,但要避免过度使用它需要品味和平衡;-).