Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类方法_Python_Oop - Fatal编程技术网

Python类方法

Python类方法,python,oop,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

我的课程如下:

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\ux
sum\ux\usquared
等传递给
update\usums
函数,以更新我该如何做,我很困惑


谢谢

self.sumx,self.sum\u x\u squared?

不用了。您可以直接访问self.sumx等


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

您不必传递它们,update\u sums可以像update一样访问它们。

您不需要传递任何东西,只需传递
self
,您必须这样做:

def update_sums(self, val):
    self.sum += val
    self.sum_squared += val * val
    ...
调用如下:
self.update\u 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)]

它仍然不理想,因为我不知道这整件事的目的是什么,但最好是拥有所有这些值。

首先,请注意,您的问题与(在Python中生成类方法)无关——它完全是关于普通实例方法的(你应该编辑你的标题……或者你的问题,如果你真的意思是关于方法的话)

就目前的Q而言,您想要做的唯一方法是传递方法需要设置的属性的名称(或足够的数据让方法重建名称),例如:


一般来说,我不推荐这种方法,因为它使代码更笨重,可读性更低,效率略低于只硬编码属性名的基本方法。如果辅助方法(此处
update\u sums
)封装了很多棘手的逻辑,您可能非常希望避免重复;但是,虽然消除重复是一项非常有价值的任务,但它需要品味和平衡,以避免过火;-)。

在我看来,好像还有另一个班级想要被释放出来。我将通过如下方式重构代码来消除重复:

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)

谢谢,但是如果我想调用update_sums来更新sum_y,我是否需要另一个函数来更新sum_y?。在C语言中,我会传递一个指针,这在Python中是如何实现的?嗨,谢谢,我正在尝试保持一个运行的和,以及一组值x,y,vx,vy的平方和。我在一个列表中收到这些,我想在我的班级中存储运行总数。对不起,我不懂你的代码,我是新来的Python@OP:这些
x,y,vx,vy
值是否有某种关联?谢谢,它们不是自变量,你为什么要问,它们有区别吗?跟踪总和和4个数字的平方和是一个非常不寻常的想法。我已经修改了代码以适合您的界面。
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)