Методы класса Python - PullRequest
       3

Методы класса Python

0 голосов
/ 15 января 2010

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

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

Спасибо

Ответы [ 6 ]

5 голосов
/ 15 января 2010

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

Для 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) заключает в себе множество хитрой логики, которую вы действительно очень хотите избежать дублирования, возможно; но хотя устранение повторений - очень стоящая задача, для того, чтобы избежать переборщения с ней, требуется вкус и баланс; -).

2 голосов
/ 15 января 2010

вам не нужно ничего передавать, кроме 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)]

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

1 голос
/ 15 января 2010

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

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)
1 голос
/ 15 января 2010

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

1 голос
/ 15 января 2010

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

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

0 голосов
/ 15 января 2010

self.sumx, self.sum_x_squared?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...