2010-01-15 2 views
0

У меня есть класс следующим образом:методы класса Python

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 для обновления, как я это делаю, я запутался.

Благодаря

ответ

1

Не нужно. У вас есть прямой доступ к self.sumx и т. Д.

Вы уверены, что функции принадлежат классу X? Кажется, вы пропускаете точку с запятой и форматирование пробелов.

1

Вам не обязательно их передавать, update_sums могут обращаться к ним так же, как и обновление.

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

это до сих пор нет идеала, потому что я не знаю, что го Цель этого всего, но лучше иметь все эти ценности.

+0

Спасибо Но если я хочу, чтобы позвонить update_sums с сказать, у обновить sum_y, мне нужна еще одна функция только для sum_y ?. В C я бы передал указатель, как это происходит в Python? – mikip

+0

Привет, Я пытаюсь сохранить текущую сумму и сумму квадратов набора значений x, y, vx, vy. Я получаю их в списке Я хочу сохранить текущие суммы в моем классе. Извините, но я не понимаю ваш код, я новичок в Python – mikip

+0

@OP: эти значения 'x, y, vx, vy' связаны каким-то образом? – SilentGhost

5

Во-первых, обратите внимание, что ваш вопрос не имеет ничего общего с classmethod (что делает класса методы в Python) - это совсем о нормальных экземпляра методов (вы должны изменить название ... или ваш вопрос, если вы do означает, что это должно быть около класс методов).

Для 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

Мне кажется, что есть еще один класс, который хочет быть выпущенным. Я хотел бы удалить дублирование рефакторинга кода, как это:

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) 
Смежные вопросы