将几个相同的方法添加到多个类中的最pythonic方法是什么?
我可以使用类装饰器,但这似乎带来了相当多的复杂性,并且比其他方法更难写入和读取。
我可以使用所有方法创建一个基类,并让其他类继承,但是对于某些类,我会非常想要允许多重继承,我经常阅读的是避免或最小化。此外,“is-a”关系不适用。
我也可以将它们从方法中改变为使它们成为独立函数,只希望它们的值通过duck-typing提供适当的属性。这在某些方面是干净的,但是它更少面向对象,并且当函数可以用在该类型的对象上时不太清楚。
我可以使用委托,但是这需要所有想要调用的类都有调用helper类方法的方法。这将使代码库比其他选项更长,并且每次我想要向辅助类添加新函数时都需要添加一个方法来委托。
我知道给一个类提供另一个类的实例,因为在某些情况下属性很好用,但它并不总是干净利落,并且可以使调用比其他方式更复杂。
在玩了一下之后,即使它导致多重继承,我仍然倾向于继承。但是我犹豫不决,因为许多文本警告非常强烈反对允许多重继承和一些(例如wikipedia条目)甚至说应该最小化代码重用的继承。
这可能更清楚一个例子,所以对于一个简化的例子说我们正在处理许多不同的类,它们都在x,y网格上有一个位置。我们可能想要使用x,y位置制作所有内容的方法,例如获取两个此类实体之间距离的方法,或相对方向,它们之间的中点等等。
让所有这些类访问这些只依赖于x和y作为属性的方法的最pythonic方法是什么?
答案 0 :(得分:3)
对于您的具体示例,我会尝试利用duck-typing。编写简单的简单函数,这些函数采用假定具有x
和y
属性的对象:
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)
这是一个很好的解决方案,因为它也很容易测试 - 没有必要继承子类来执行特定的功能。