Python 重构(类中相似方法)

1 投票
3 回答
1140 浏览
提问于 2025-04-16 00:38

Python重构

这段代码里的addsub功能很相似。那我们该怎么对这样的代码进行重构呢?它们的逻辑其实是相反的。

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)

...不过这样做似乎会更复杂,而且收获不大。

撰写回答