Pythonic方法为几个类添加几个方法?

时间:2012-10-19 21:35:09

标签: python inheritance styles decorator

将几个相同的方法添加到多个类中的最pythonic方法是什么?


我可以使用类装饰器,但这似乎带来了相当多的复杂性,并且比其他方法更难写入和读取。

我可以使用所有方法创建一个基类,并让其他类继承,但是对于某些类,我会非常想要允许多重继承,我经常阅读的是避免或最小化。此外,“is-a”关系不适用。

我也可以将它们从方法中改变为使它们成为独立函数,只希望它们的值通过duck-typing提供适当的属性。这在某些方面是干净的,但是它更少面向对象,并且当函数可以用在该类型的对象上时不太清楚。

我可以使用委托,但是这需要所有想要调用的类都有调用helper类方法的方法。这将使代码库比其他选项更长,并且每次我想要向辅助类添加新函数时都需要添加一个方法来委托。

我知道给一个类提供另一个类的实例,因为在某些情况下属性很好用,但它并不总是干净利落,并且可以使调用比其他方式更复杂。

在玩了一下之后,即使它导致多重继承,我仍然倾向于继承。但是我犹豫不决,因为许多文本警告非常强烈反对允许多重继承和一些(例如wikipedia条目)甚至说应该最小化代码重用的继承。


这可能更清楚一个例子,所以对于一个简化的例子说我们正在处理许多不同的类,它们都在x,y网格上有一个位置。我们可能想要使用x,y位置制作所有内容的方法,例如获取两个此类实体之间距离的方法,或相对方向,它们之间的中点等等。

让所有这些类访问这些只依赖于x和y作为属性的方法的最pythonic方法是什么?

2 个答案:

答案 0 :(得分:3)

对于您的具体示例,我会尝试利用duck-typing。编写简单的简单函数,这些函数采用假定具有xy属性的对象:

def distance(a, b):
    """ 
    Returns distance between `a` and `b`.
    `a` and `b` should have `x` and `y` attributes.
    """

    return math.sqrt((a.x-b.x)**2 + (a.y-b.y)**2)

很简单。要明确如何使用该功能,只需记录即可。

答案 1 :(得分:2)

普通旧功能最适合此问题。例如。而不是......

class BaseGeoObject:

  def distanceFromZeroZero(self):
    return math.sqrt(self.x()**2 + self.y()**2)
  ...

...只是有这样的功能:

def distanceFromZeroZero(point):
  return math.sqrt(point.x()**2 + point.y()**2)

这是一个很好的解决方案,因为它也很容易测试 - 没有必要继承子类来执行特定的功能。