Python 重构(类中相似方法)
Python重构
这段代码里的add和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 )
3 个回答
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)
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)
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)
...不过这样做似乎会更复杂,而且收获不大。