рефакторинг Python (аналогичные методы в классе)

1

Рефакторинг Python

Оба добавления и sub очень похожи. Как перекомпоновать такой код? Логика в основном инвертирует друг друга.

class point(object):

      def __init__( self, x, y ):
          self.x, self.y = x, y

      def add( self, p ):
          x = self.x + p.x
          y = self.y + p.y
          return point( x, y )

      def sub( self, p ):
          x = self.x - p.x
          y = self.y - p.y
          return point( x, y )
  • 0
    Это фундаментальные операции. Как вы думаете, как будет выглядеть рефакторинг? Это вопрос интервью / домашней работы?
  • 0
    Не домашнее задание или интервью. Я заинтересован в парадигме. Знаете ли вы о питоническом способе представления методов класса, чтобы я не повторял ту же логику?
Теги:
refactoring

3 ответа

2
Лучший ответ

Во-первых, стандартная практика заключается в том, чтобы использовать классы (так Point, а не Point). Я бы использовал __add__ и __sub__ (и, возможно, __iadd__ и __isub__). Первый разрез может выглядеть так:

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, p):
        return Point(self.x + p.x, self.y + p.y)

    def __sub__(self, p):
        return Point(self.x - p.x, self.y - p.y)

Я знаю, что вы хотите вывести логику в один метод, например:

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def _adjust(self, x, y):
        return Point(self.x + x, self.y + y)

    def __add__(self, p):
        return self._adjust(p.x, p.y)

    def __sub__(self, p):
        return self._adjust(-p.x, -p.y)

... но это кажется более сложным, без особого выигрыша.

  • 0
    Это то, что я искал. Я не знал, что у питона есть надстройка и саб . Также подчеркивание перед _adjust, каково значение и соглашение для этого? Я согласен, что добавление метода настройки сложнее без усиления. Спасибо за этот ответ.
  • 1
    Подчеркивание в _adjust - это просто соглашение Python о том, что метод является "полуприватным". Практически нет разницы, за исключением того, что он сигнализирует другим, читающим код, что им, вероятно, следует избегать его непосредственного вызова, если они не знают, что делают. Примечание: это не относится к двойному подчеркиванию (например, __adjust ). Подробности смотрите в docs.python.org/tutorial/classes.html#private-variables .
Показать ещё 1 комментарий
2

Как насчет этого:

import operator

class point(object):
    def __init__( self, x, y ):
        self.x, self.y = x, y

    def _do_op(self, op, p):
        x = op(self.x, p.x)
        y = op(self.y, p.y)
        return point(x, y)

    def add( self, p ):
        return self._do_op(operator.add, p)

    def sub( self, p ):
        return self._do_op(operator.sub, p)
  • 0
    Это было то, что я придумал. Хотя в этом простом примере это на самом деле не приносит вам большой пользы, оно ДОЛЖНО позволить вам внутренне скрыть представление точки. Методы не заботятся о том, какие переменные участвуют в сложении или вычитании, просто это должно быть сделано по существу.
0

Здесь вы можете что-то сделать.

def __add__(self, p):   # used this so that you can add using the + operator
    x = self.x + p.x
    y = self.y + p.y
    return point(x, y)

def __sub__(self, p):
    return self + point(-p.x, -p.y)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню