Оба добавления и 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 )
Во-первых, стандартная практика заключается в том, чтобы использовать классы (так 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)
... но это кажется более сложным, без особого выигрыша.
_adjust
- это просто соглашение Python о том, что метод является "полуприватным". Практически нет разницы, за исключением того, что он сигнализирует другим, читающим код, что им, вероятно, следует избегать его непосредственного вызова, если они не знают, что делают. Примечание: это не относится к двойному подчеркиванию (например, __adjust
). Подробности смотрите в docs.python.org/tutorial/classes.html#private-variables .
Как насчет этого:
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)
Здесь вы можете что-то сделать.
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)