Python: как переопределить атрибуты данных в вызовах методов? - PullRequest
3 голосов
/ 26 июля 2010

Мой вопрос заключается в том, как использовать атрибуты данных в методе, но разрешить их индивидуальную переопределение при вызове метода. Этот пример демонстрирует, как я пытался это сделать:

class Class:
    def __init__(self):
         self.red = 1
         self.blue = 2
         self.yellow = 3
    def calculate(self, red=self.red, blue=self.blue, yellow=self.yellow):
         return red + blue + yellow

C = Class
print C.calculate()
print C.calculate(red=4)

Имеет ли смысл то, что я пытаюсь достичь? Когда вызывается функция вычисления, я хочу, чтобы она по умолчанию использовала атрибуты данных для красного, синего и желтого цветов. Но если в вызове метода явно указан другой параметр (red = 4), я хочу, чтобы вместо него использовалось указанное значение. Когда я запускаю это, выдает ошибку для использования «я». в поле параметров (говоря, что это не определено). Есть ли способ сделать эту работу? Спасибо.

Ответы [ 3 ]

4 голосов
/ 26 июля 2010

Вы не можете сослаться на self, поскольку он еще не находится в области видимости.

Идиоматический способ - сделать это вместо этого:

def calculate(self, red=None, blue=None, yellow=None):
    if red is None:
        red = self.red
    if blue is None:
        blue = self.blue
    if yellow is None:
        yellow = self.yellow
    return red + blue + yellow

«Идиоматический», увы, не всегда означает «хороший, лаконичный и питонский».

Изменить: это не делает его лучше, не так ли ...

def calculate(self, red=None, blue=None, yellow=None):
    red, blue, yellow = map(
        lambda (a, m): m if a is None else a,
        zip([red, blue, yellow], [self.red, self.blue, self.yellow]))
    return red + blue + yellow
1 голос
/ 26 июля 2010

Другой вариант - использовать ** kwargs и атрибут класса:

class Calc:
  defaults = {
      'red': 1, 'blue': 2, 'yellow': 3
      }
  def __init__(self, **kwargs):
    self.__dict__.update(self.defaults)
    self.__dict__.update(kwargs)
0 голосов
/ 26 июля 2010

Вы можете написать это в меньшем количестве строк:

def calculate(self, red=None, blue=None, yellow=None):
    red = self.red if red is None else red
    blue = self.blue if blue is None else blue
    yellow = self.yellow if yellow is None else yellow
    return red + blue + yellow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...